Aracılığıyla paylaş


XQuery ve statik yazma

Içinde XQuery SQL Server statik olarak yazılan bir dildir. Bir ifade yazın veya bir belirli bir işlev veya yedekleme işletmeni tarafından kabul edilen önem sahip bir değer verdiğinde, bu tür hataları sorgu derlenirken yükseltir.Ayrıca, statik türde denetimi da bir yol olmadığını algılayabilir ifade yazılan bir XML belgesi yanlış yazmış.XQuery Derleyici ilk örtülü operasyonlar, atomization gibi ekler ve sonra da statik türde kesmesi ve statik tür denetimi gerçekleştirir normalleştirme aşama uygulanır.

Statik tür kesmesi

Statik türde kesmesi dönüş türünü belirleyen bir ifade.Bu giriş parametreleri statik türlerini ve operasyonun statik semantik alma ve sonucu statik türünü gösterilirken belirler.Örneğin, 1 + 2.3 ifade statik türü aşağıdaki şekilde belirlenir:

  • Statik türü 1 xs:Integer ve 2.3 statik türü olanxs:decimal.Dinamik semantik üzerinde statik semantik, temel + işlemi, tamsayı, ondalık bir sayıya dönüştürür ve sonra ondalık sayı döndürür.Sonra inferred statik türde olması xs:decimal.

XML türlenmemiş örnekleri için verileri değil yazıldı belirtmek için özel bir tür vardır.Bu bilgiler statik tür denetimi sırasında ve belirli bir örtülü yayınları gerçekleştirmek için kullanılır).

Yazılan verileri için giriş türü XML veri türü örnek sınırlar XML şeması topluluğundan değişkenden.Örneğin, şema türü yalnızca öğeleri sağlar xs:Integer, bir yol sonuçlarnı ifade, öğe kullanarak, sıfır veya daha çok öğe türü olurxs:Integer.Bu gibi bir ifade kullanarak şu anda gösterilir element(age,xs:integer)* Burada yıldız işareti (*) önem düzeyini, ortaya çıkan türünü gösterir. Örneğin, ifade "Yaş" adı ve türü sıfır veya daha çok öğeler neden olabilir xs:integer. Diğer cardinalities biri olan ve tek başına, tür adı'nı kullanarak ifade sıfır veya bir ve bir soru işareti () kullanarak ifade?), 1 veya daha fazla ve belirtilen bir artı işareti () kullanarak+).

Bazı durumlarda, statik türde kesmesi ifade her zaman boş sırası döndürecektir algılayın.Örneğin, bir yol, ifade türü yazılan bir XML verileri üzerinde aradığı bir <adı> öğesi içinde bir <Müşteri> öğe (ad/müşteriye /), ancak şema izin vermez bir <adı> içinde bir <Müşteri>, statik türde kesmesi sonuç boş olacaktır algılayın. Bu yanlış sorgularını algılamak için kullanılan ve ifade olduğu sürece () statik bir hata bildirdi veya data( () ).

Ayrıntılı kesmesi kuralları XQuery belirtimi içinde resmi semantik sağlanır.Microsoft, bu yalnızca biraz da türü örnekleri yazılan bir XML verileriyle çalışmak için değiştirdi.En önemli değişiklik standardı örtülü belge düğümü, XML veri türü örnek hakkında türünü biliyor ' dir.Sonuç olarak, form /age, bir yol ifadesi tam olarak bu bilgilere dayanarak yazılmaları.

Kullanarak SQL Server Profiler'ı kullanma, sorgu derleme bir parçası olarak verilen bir statik türler görebilirsiniz. Bunlar görmek için izleme TSQL olay kategorisinde XQuery statik tür olay eklemeniz gerekir.

Statik yazım denetimi

Statik tür denetleme, çalışma-sağlar saat yürütme işlemi için uygun türü değerleri yalnızca alacak.Çalışma sırasında denetlenecek türü olmadığından saat, erken derleme içinde olası hataları algıladı.Bu, performansın iyileşmesine yardımcı olur.Ancak, statik olarak yazarak, sorgu yazıcı sorguda formulating içinde daha dikkatli olmasını gerektirir.

Kullanılabilir uygun türleri şunlardır:

  • Bir işlev veya bir işlem tarafından açıkça izin verilen türleri.

  • Bir alt açıkça izin verilen bir tür.

Alt türlerinden türetme kullanarak subtyping kurallarını kısıtlama veya XML şemasının uzantısı dayalı olarak tanımlanır.Örneğin, S alt türü olan bir türü yazın T, S türündeki tüm değerleri aynı zamanda T. türü örnekleri

Ayrıca, tüm tamsayı değerler de XML şema türü hiyerarşisinde temel ondalık, değerlerdir.Ancak, tüm ondalık değerleri tamsayılardır.Bu nedenle, bir alt türü tamsayıdır ondalık, ancak bunun tersi.Örneğin, + işlemi yalnızca sayısal tür gibi belirli türlerdeki değerleri verir.xs:Integer, xs:decimal, xs:float, and xs:double.Diğer değerleri yazarsa gibi xs:dizeolan geçirildi, işlem türü bir hata oluşturur.Bu güçlü yazarak olarak adlandırılır.Türlenmemiş XML göstermek için kullanılan atomik türü gibi diğer türlerdeki değerleri, işlem kabul eden bir tür değeri için örtülü dönüştürülebilir.Bu zayıf yazarak olarak adlandırılır.

Bir örtülü dönüştürmeden sonra statik gerekiyorsa tür denetimi doğru önem ile izin verilen bağlantı türlerini yalnızca belirli bir değer bir işleme iletilir güvence altına alır."Dize" + 1, "dize" statik türü olduğunu tanıdığı xs:String.Bunun için izin verilen bir türü olduğundan + işlemi, bir tür hata ortaya çıkar.

Bir rasgele ifade E2 için rasgele bir ifade E1 sonucu ekleme örneğinde (E1 + E2), statik türde kesmesi ilk E1 ve E2 statik türlerini belirler ve sonra da işlemi için izin verilen türleriyle statik bunların türlerini denetler.Ya da E1 statik türü olabilir, örneğin, bir xs:dize or an xs:Integer, çalışma sırasında bazı değerleri olsa tür hata için statik türde onay yükseltir saat tamsayılar olabilir.Statik E1 türünü, aynı durumda olabilir xs:Integer*.Çünkü + işlemi, yalnızca tam olarak bir tamsayı değeri kabul eder ve E1 sıfır dönmek ya da birden çok 1, statik türde onay hata yükseltir.

Daha önce belirtildiği gibi tür kesmesi, hangi kullanıcı Geçirilmekte olan verileri hakkında öğrenene daha geniş bir türü sık infers.Bu durumda, kullanıcının sorguyu yeniden gerekir.Normal bazı durumlar şunlardır:

  • Tür bir supertype ya da bir birleşim türü daha genel bir tür infers.Türü bir atomik türü, gerçek statik türde belirtmek için ifade veya kurucu cast işlevini kullanmalısınız.Örneğin, ifade E1 inferred türü arasında bir seçim ise xs:dize or xs:Integer ve eklenmesi gerekiyorxs:Integer yazmalısınız.xs:integer(E1) + E2 yerine E1+E2. Bu ifade, çalışma sırasında başarısız olabilir saat bir dize girilirse için atanamaz xs:Integer.Bununla birlikte, ifade artık statik türde onay geçirir.Ile başlayan SQL Server 2005, bu ifade için boş sıra eşleştirilir.

  • Türü, gerçekte ne verileri içeren daha yüksek önem düzeyi infers.Genellikle, çünkü böyle XML veri türü, birden çok üst düzey öğesi içerebilir ve bir XML şema koleksiyon bu sınırlamak edemiyor.Statik türde azaltmak ve aslında en Geçirilmekte olan bir değeri olduğunu garanti etmek için konum yüklemi kullanmalısınız. [1]. Örneğin, 1 özniteliği değerine eklemek için c öğe b bir öğeyi, üst düzey altında olmalıdır write (/a/b/@c)[1]+1. Ayrıca, DOCUMENT anahtar sözcüğünü, bir XML şema koleksiyon ile birlikte kullanılabilir.

  • Bazı işlemleri sırasında kesmesi tür bilgileri kaybedersiniz.Örneğin, bir düğüm türü belirlenemedi, durumuna gelir anyType. Bu örtülü olarak başka bir türü artığını değil.Bu dönüşüm, üst eksen kullanarak özellikle gezinti sırasında oluşur.Bu işlemler kullanmaktan kaçının ve ifade statik türde bir hata oluşturur, sorguyu yeniden gerekir.

tür denetimi, sendika türleri

Birleşim türü, tür denetlemesi nedeniyle dikkatli işleme gerektirir.Sorunlar, aşağıdaki örneklerde gösterilmiştir.

Örnek: Birleşim türü üzerinden işlev

Bir öğe tanımı için göz önünde bulundurun. <r> bir birleşim türü:

<xs:element name="r">
<xs:simpleType>
   <xs:union memberTypes="xs:int xs:float xs:double"/>
</xs:simpleType>
</xs:element>

XQuery içeriğinde "ortalama" işlev fn:avg (//r) XQuery derleyici farklı türlerinin (değerlerinin ekleyemezsiniz çünkü statik bir hata döndürür.xs:int, xs:float veya xs:double) için <r> bağımsız değişken öğeler fn:avg(). Bunu çözmek için , işlev çağrısı olarak yeniden yazın. fn:avg(for $r in //r return $r cast as xs:double ?).

Örnek: Birleşim türü üzerinden işleç

Toplama işlemi ('+'), kesin bir işlenen türleri gerektirir.Bir sonucu olarak, ifade (//r)[1] + 1 Yukarıda açıklanan tür tanımında öğe için olan statik bir hata döndürür. <r>. Olarak yeniden yazmak için bir çözümdür (//r)[1] cast as xs:int? +1, burada "?" 0 veya 1 tekrarı gösterir. Ile başlayan SQL Server 2005, SQL Serverherhangi bir atama çalışma zamanı hataları sonucunda boş sıra neden olabileceğinden, "" yerine"artığını?", gerektirir.