XQuery ve statik yazma
XQuery SQL Serverstatik olarak yazılan bir dildir. İfade türü veya belirli işlevi veya operatör tarafından kabul edilmez önem düzeyi olan bir değer döndürürse, sorgu derleme sırasında türü hata yükseltir. Ayrıca, statik tür denetlemesi da yazılan bir xml belge üzerinde yol ifadesi yanlış yazmış olabilirsiniz algılayabilir. XQuery derleyici ilk atomization gibi örtülü operasyonlar ekler ve statik tür kesmesi ve statik tür denetleme gerçekleştirir ve normalleştirme aşamasında geçerlidir.
Statik tür kesmesi
Statik tür kesmesi ifade dönüş türünü belirler. Bu giriş parametreleri statik türde ve işlem statik semantiği alarak ve sonuç statik tür inferring belirler. Örneğin, 1 + 2.3 ifade statik türü aşağıdaki şekilde belirlenir:
- 1 Statik türü XS ve 2.3 statik türü xs: decimal. Dinamik semantiği, statik semantiği dayalı + işlem tamsayı, ondalık sayıya dönüştürür ve sonra ondalık döndürür. Inferred statik türde sonra olacağını xs: decimal.
Yazılmamış xml örnekleri için verileri değil yazıldı belirtmek için özel türleri vardır. Bu bilgiler statik tür denetlemesi sırasında ve bazı örtülü atmalarını gerçekleştirmek için kullanılır).
Yazılan veriler için giriş türü, xml veri türü örneği kısıtlamalara xml şema koleksiyonu olayla. Örneğin, şema türü tek öğelere izin veren XS, bu elemanı kullanılarak yol ifadesi sonucu sıfır veya daha fazla öğe türü olacak XS. Bu geçerli bir ifade gibi kullanarak ifade element(age,xs:integer)*burada yıldız(*) sonuç türü önem gösterir. Örneğin, adı "yaş" sıfır veya daha fazla öğeleri ifade neden olabilir yazın xs:integer. Diğer cardinalities tam bir ve yalnız, tür adı kullanarak ifade sıfır veya bir soru işareti kullanarak ifade (?) ve 1 veya daha fazla ve artı işareti kullanarak ifade (+).
Bazen, statik tür kesmesi ifade her zaman boş sırası döndürür ulaşabilirse. Yazılı xml veri türü üzerinde yol ifadesi ise, aradığı bir <adı> öğesi içinde bir <müşteri> öğesi (/ müşteri/ad), ancak şema izin vermez bir <adı> içinde bir <müşteri>, statik tür kesmesi sonucu boş sonucuna. Bu hatalı sorgu algılamak için kullanılan ve sürece ifade () statik bir hata bildirilir veya data( () ).
Detaylı çıkarsama kuralları içinde biçimsel anlambilim XQuery belirtimi sunulmaktadır. Microsoft, bu yalnızca biraz türü örnekleri yazılı xml verileriyle çalışmak için değiştirdi. Standart en önemli değişiklik, örtülü belge düğümü xml veri türü örneği türünü hakkında bilmek olduğunu. Sonuç olarak, formu /age bir yol ifadesi kesin bu bilgilere dayalı yazılması.
Kullanarak SQL Server Profiler şablonları ve izinler, sorgu derleme bir parçası olarak döndürülen statik türlerini görebilirsiniz. Bunlar görmek için izleme tsql olay kategorisinde XQuery statik tür olay içermelidir.
Statik tür denetlemesi
Statik tür denetleme çalıştırma yürütme sadece işlemi için uygun türü değerleri alırsınız sağlar. Türleri zamanında teslim gerekmez çünkü olası hataları derleme erken tespit edilebilir. Bu, performansın iyileşmesine yardımcı olur. Ancak, statik yazarak sorgu yazar sorgu formüle daha dikkatli olması gerekir.
Kullanılabilecek uygun türleri şunlardır:
Bir işlev veya işlem tarafından açıkça izin türleri.
Açıkça izin verilen türde bir alt tür.
Alt tür kısıtlama veya xml şema uzantısı tarafından türetme kullanarak subtyping kuralları esas olarak tanımlanır. Örneğin, s alt türü olan bir türü yazın t, eğer s türü olan tüm değerleri de t. türü örnekleri
Ayrıca, tüm tamsayı değerler xml şema türü hiyerarşisi dayanan bir ondalık değerler de kullanılabilir. Ancak, tüm ondalık tamsayı değerlerdir. Bu nedenle, bir alt bir tamsayıdır ondalık, ancak tersi. Örneğin, + işlemi yalnızca değerleri sayısal türleri gibi belirli türleri sağlar XS, xs: decimal, xs: float, ve xs: Double. Diğer değerler yazarsa gibi XS, olan geçti, işlem türü hata yükseltir. Bu güçlü tipik olarak adlandırılır. Yazılmamış xml belirtmek için kullanılan atomik türü gibi diğer türlerinden değerleri işlem kabul eden bir tür değerine örtük olarak dönüştürülebilir. Bu zayıf tipik olarak adlandırılır.
Bir kapalı dönüştürme sonra gerekirse, statik tür denetlemesi yalnızca doğru önem verilen türleriyle değerlerini bir işleme geçirilir garanti eder. "Dize" + 1, tanıdığı, "dizge" statik türü ise XS. Bunun için izin verilen bir türü olmadığından + işlemi, tür hatası yükseltilmiş.
Rasgele ifadeyi E1 E2 rasgele ifade sonucu (E1 + E2) ekleyerek, rezervasyonun statik tür kesmesi ilk statik tür E1 ve E2 belirler ve sonra operasyon için izin verilen türleriyle statik kendi türlerini denetler. E1 statik türü ya da olabilir, örneğin, bir XS ya da bir XS, statik türde denetim türü hata yükseltir, düz-se bile bazı değerler çalışma zamanında tamsayı olabilir. E1 statik türü olsaydı aynı durumda olacağını Örneğin,(1,2). Çünkü + işlemi yalnızca bir tamsayı değeri kabul ve E1 iade sıfır veya daha fazla 1, statik tip onay hata yükseltir.
Daha önce belirtildiği gibi tür kesmesi sık kullanıcı geçti veri türü hakkında ne bilir daha geniş bir türünü algılar. Bu durumda, kullanıcının sorguyu yeniden yazın yeterlidir. Bazı tipik durumlar arasında şunlar yer alır:
Türü, bir supertype veya bir birlik türleri gibi daha genel bir türünü algılar. Türü bir atomik türü ise, gerçek statik türü belirtmek için döküm ifade veya yapıcısı işlevini kullanmalısınız. Örneğin ifade E1 Inferred türü arasında bir seçimdir, XS veya xs: integer ve ayrıca XS, yazmak gerektiğini xs:integer(E1) + E2yerine E1+E2. Bu ifade bir dize değeri girilirse zamanında başarısız olabilir, can't döküm için XS. Ancak, ifade şimdi statik tip onay geçecek. İle başlayan SQL Server 2005, bu ifade için boş sırası eşleştirilir.
Ne gerçek verileri içeren daha yüksek bir önem türünü algılar. Sık sık, çünkü böyle xml veri türü birden fazla üst düzey öğesi içerebilir ve bir xml şema koleksiyonu bu sınırlamak değildir. Statik türde azaltmak ve orada gerçekten en çok geçirilen bir değeri garanti için konumsal yüklemi kullanmanız gerekir [1]. Örneğin, 1 öznitelik değerine eklemek için celeman baltında üst düzey bir unsur, sen-meli write (/a/b/@c)[1]+1. Ayrıca, belgenin anahtar xml şema koleksiyonu ile birlikte kullanılabilir.
Bazı işlemleri sırasında çıkarsama türü bilgilerini kaybedersiniz. Örneğin, düğüm türü belirlenemiyorsa bu duruma anyType. Bu örtülü olarak başka bir türü artık yok. Bu dönüşümler, ana ekseni kullanarak özellikle navigasyon sırasında ortaya çıkar. Bu işlemler kullanmaktan kaçının ve ifade statik tür hatası oluşturursanız sorgu yeniden yazmak gerekir.
Birleşim türleri denetimi türü
Birleşim türleri, tür denetlemesi nedeniyle dikkatli işleme gerektirir. İki sorunları aşağıdaki örneklerde gösterilmiştir.
Örnek: İşlev birleşim türü üzerinden
Bir öğe tanımı dikkate <r> birleşim türü:
<xs:element name="r">
<xs:simpleType>
<xs:union memberTypes="xs:int xs:float xs:double"/>
</xs:simpleType>
</xs:element>
<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 değerleri farklı türdeki ekleyemezsiniz çünkü statik bir hata verir (xs:int, xs:floatya xs:double) için <r>bağımsız öğeler fn:avg(). Bunu çözmek için işlev çağrısı olarak yeniden fn:avg(for $r in //r return $r cast as xs:double ?).
Örnek: İşleç birleşim türü üzerinden
Toplama işlemi ('+') hassas tip işlenenler gerekir. Sonucunda, ifadeyi (//r)[1] + 1öğesi için daha önce açıklanan tür tanımı olan statik hata verir <r>. Tek çözüm olduğu gibi yeniden yazmak için (//r)[1] cast as xs:int? +1, burada "?" 0 veya 1 tekrarı gösterir. İle başlayan SQL Server 2005, SQL Server"gibi oyuncular" gerektirir ile "?", çünkü herhangi bir döküm boş sırası çalışma zamanı hataları sonucu neden olabilir.