XQuery'de Tür Atama Kuralları

Şunlar için geçerlidir: SQL Server

Aşağıdaki W3C XQuery 1.0 ve XPath 2.0 Fonksiyonlar ve Operatörler spesifikasyon diyagramı, yerleşik veri türlerini göstermektedir. Bu, yerleşik ilkel ve yerleşik türetilmiş türleri de kapsar.

XQuery 1.0 tip hiyerarşisi

Bu konu, bir tipten diğerine dökme yaparken uygulanan tip döküm kurallarını aşağıdaki yöntemlerden biriyle açıklar:

  • Cast as veya type constructor fonksiyonlarını kullanarak yapılan açık casting (örneğin, xs:integer("5")).

  • Tip terfi sırasında gerçekleşen örtük oyuncu seçimi

Açık Oyuncu Seçimi

Aşağıdaki tablo, yerleşik ilkel tipler arasında izin verilen tip dökümünü özetlemektedir.

XQuery için oyuncu seçimi kurallarını açıklar.

  • Yerleşik bir ilkel tip, tablodaki kurallara dayanarak başka bir yerleşik ilkel tipe dökebilir.

  • İlkel tip, o ilkel tipten türetilen herhangi bir tipe dökülebilir. Örneğin, xs:decimal'danxs:integer'a veya xs:decimal'denxs:long'a çevirebilirsiniz.

  • Türevden türetilen tip, tip hiyerarşisindeki atası olan herhangi bir tipe, yerleşik ilkel temel tipine kadar dökülebilir. Örneğin, xs:token'danxs:normalizedString'e veya xs:string'e dökebilirsiniz.

  • Türetilmiş bir tip, ilkel atası hedef tipe uygulanabilirse ilkel tipe dönüştürülebilir. Örneğin, türetilmiş bir tip olan xs:integer'i, ilkel bir xs:string tipine dökebilirsiniz, çünkü xs:decimal, xs:integer'in ilkel atası, xs:string'e dönüştürülebilir.

  • Bir türe tür, kaynak tipin ilkel atası hedef tipin ilkel atasına büyülenebiliyorsa, başka bir türe dönüştürülebilir. Örneğin, xs:integer ile xs:token'a dökebilirsiniz, çünkü xs:decimal'danxs:string'e çevirebilirsiniz.

  • Kullanıcı tanımlı tiplerin yerleşik tiplere dökme kuralları, yerleşik tiplerle aynıdır. Örneğin, xs:integer tipinden türetilen bir myInteger tipi tanımlayabilirsiniz. Sonra, myIntegerxs:token olarak kullanılabilir, çünkü xs:decimalxs:string'e dönüştürülebilir.

Aşağıdaki oyuncu seçimi türleri desteklenmemektedir:

  • Liste türlerine veya listelerinden kast yapmak yasaktır. Bu, hem kullanıcı tanımlı liste türlerini hem de xs:IDREFS, xs:ENTITIES ve xs:NMTOKEN gibi yerleşik liste türlerini içerir.

  • xs:QName'den veya oradan yayın yapmak desteklenmiyor.

  • xs:NOTATION ve tam sıralı süreli alt tipler olan xdt:yearMonthDuration ve xdt:dayTimeDuration desteklenmez. Sonuç olarak, bu tür türlerine veya bu türlerden kasting yapılması desteklenmez.

Aşağıdaki örnekler açık tip dökümü göstermektedir.

Örnek A

Aşağıdaki örnek, bir xml tipi değişkeni sorgular. Sorgu, xs:string olarak tiplenen basit bir tür değerinden oluşan bir diziyi döndürür.

declare @x xml  
set @x = '<e>1</e><e>2</e>'  
select @x.query('/e[1] cast as xs:string?')  
go  

Örnek B

Aşağıdaki örnek, tiplenmiş bir xml değişkenini sorgular. Örnek önce bir XML şema koleksiyonu oluşturur. Daha sonra XML şema koleksiyonunu kullanarak tiplenmiş bir xml değişkeni oluşturur. Şema, değişkene atanan XML örneği için tip bilgilerini sağlar. Sorgular daha sonra değişkene karşı belirlenir.

create xml schema collection myCollection as N'  
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">  
      <xs:element name="root">  
            <xs:complexType>  
                  <xs:sequence>  
                        <xs:element name="A" type="xs:string"/>  
                        <xs:element name="B" type="xs:string"/>  
                        <xs:element name="C" type="xs:string"/>  
                  </xs:sequence>  
            </xs:complexType>  
      </xs:element>  
</xs:schema>'  
go  

Aşağıdaki sorgu, belge örneğinde kaç üst seviye <root> öğe olduğunu bilmiyorsunuz ve statik bir hata döndürür.

declare @x xml(myCollection)  
set @x = '<root><A>1</A><B>2</B><C>3</C></root>  
          <root><A>4</A><B>5</B><C>6</baz></C>'  
select @x.query('/root/A cast as xs:string?')  
go  

İfadede tek bir <root> eleman belirtildiğinde sorgu başarılı olur. Sorgu, xs:string olarak tiplenen basit bir tür değerinden oluşan bir diziyi döndürür.

declare @x xml(myCollection)  
set @x = '<root><A>1</A><B>2</B><C>3</C></root>  
              <root><A>4</A><B>5</B><C>6</C></root>'  
select @x.query('/root[1]/A cast as xs:string?')  
go  

Aşağıdaki örnekte, xml tip değişkeni, XML şema koleksiyonunu belirten bir belge anahtar kelimesi içerir. Bu, XML örneğinin tek bir üst düzey öğeye sahip bir belge olması gerektiğini gösterir. XML örneğinde iki <root> eleman oluşturursanız, hata döner.

declare @x xml(document myCollection)  
set @x = '<root><A>1</A><B>2</B><C>3</C></root>  
              <root><A>4</A><B>5</B><C>6</C></root>'  
go  

Örneği sadece bir üst seviye öğe içerecek şekilde değiştirebilirsiniz ve sorgu çalışır. Yine, sorgu xs:string olarak tiplenen basit bir tür değerinin bir dizisini döndürür.

declare @x xml(document myCollection)  
set @x = '<root><A>1</A><B>2</B><C>3</C></root>'  
select @x.query('/root/A cast as xs:string?')  
go  

İpli Oyuncu Seçimi

İmplicit döküm yalnızca sayısal tipler ve tipsiz atomik tipler için izin verilir. Örneğin, aşağıdaki min() fonksiyonu iki değerin minimumunu döndürür:

min(xs:integer("1"), xs:double("1.1"))  

Bu örnekte, XQuery min() fonksiyonuna verilen iki değer farklı türdedir. Bu nedenle, tam sayı tipinin çifte çevrildiği ve iki çift değerin karşılaştırıldığı örtük dönüşüm yapılır.

Bu örnekte tanımlanan tür promosyonu şu kurallara uyar:

  • Yerleşik türetilmiş sayısal tip, temel tipine yükseltilebilir. Örneğin, tam sayıondalık olarak yükseltilebilir.

  • Bir ondalık float'a yükseltilebilir, bir float ise çifte yükseltilebilir.

Örtük döküm yalnızca sayısal tipler için izin verildiğinden, aşağıdakilere izin verilmez:

  • Tel türleri için örtük döküm yasaktır. Örneğin, iki dizi türü bekleniyorsa ve bir dizi ile bir token aktarıyorsanız, örtük bir döküm olmaz ve hata döner.

  • Sayısal tiplerden string tiplerine örtük kastlama yasaktır. Örneğin, bir fonksiyona tam sayı tipi değeri verirseniz, bir dizi tipi parametresi bekleyen bir fonksiyona örtük döküm olmaz ve hata döner.

Döküm değerleri

Bir türden diğerine döküm yapılırken, gerçek değerler kaynak tipin değer uzayından hedef tipin değer uzayına dönüştürülür. Örneğin, xs:ondalık bir sistemden xs:double'a dökmek, ondalık değeri çifte dönüştürür.

Aşağıda dönüşüm kurallarından bazıları yer almaktadır.

Bir diziden veya untypedAtomic tipinden bir değer dökmek

Bir string veya untypedAtomic tipine dökülen değer, hedef tipin kurallarına göre değerin doğrulanması gibi dönüştürülür. Bu, nihai desen ve boşluk işleme kurallarını da kapsar. Örneğin, aşağıdaki başarı sağlar ve çift değer olan 1.1e0 oluşturur:

xs:double("1.1")

Bir diziden veya untypedAtomic tipinden xs:base64Binary veya xs:hexBinary gibi ikili tiplere dökme yapılırken, giriş değerleri sırasıyla base64 veya hex kodlanmış olmalıdır.

Bir değeri bir string veya untypedAtomic tipine dökmek

Bir string veya untypedAtomic tipine dökmek, değeri XQuery kanonik sözcük temsiline dönüştürür. Özellikle, bu durum, giriş sırasında belirli bir desen veya başka bir kısıtlamaya uymuş olabilecek bir değerin o kısıtlamaya göre temsil edilmeyeceği anlamına gelebilir. Kullanıcıları bilgilendirmek için, SQL Server, tür kısıtlamasının sorun olabileceği türleri işaretler; bu tipler şema koleksiyonuna yüklendiğinde uyarı verir.

Tip xs:float veya xs:double değeri veya bunların herhangi bir alt tipi bir string veya untypedAtomic tipine döküldüğünde, değer bilimsel gösterimde temsil edilir. Bu sadece değerin mutlak değeri 1.0E-6'dan az veya 1.0E6'dan büyük veya eşit olduğunda yapılır. Bu, 0'ın bilimsel gösterimde 0.0E0'a serileştirildiği anlamına gelir.

Örneğin, dize değerini "11.1"döndürürkenxs:string(-0.00000000002e0), dize değerini döndürür, "-2.0E-11". xs:string(1.11e1)

Xs:base64Binary veya xs:hexBinary gibi ikili tipler bir string veya untypedAtomic tipine dökülürken, ikili değerler sırasıyla base64 veya hex kodlanmış formda temsil edilir.

Bir değeri sayısal tipe dökmek

Bir sayısal tipte bir değer başka bir sayısal tipin değerine dökerken, değer bir değer uzayından diğerine dizi serilemesinden geçmeden eşlenir. Değer hedef türünün kısıtlamasını karşılamazsa, aşağıdaki kurallar geçerlidir:

  • Kaynak değer zaten sayısalsa ve hedef tip ya xs:float ya da -INF veya INF değerlerine izin veren bir alt türüyse ve kaynak sayısal değerin dökülmesi taşma ile sonuçlanacaksa, değer pozitifse INF ile eşlenir, değer negatif ise -INF değer ile eşlenir. Hedef tip INF veya -INF'ye izin vermiyorsa ve taşma oluşursa, döküm başarısız olur ve bu SQL Server sürümünün sonucu boş dizisidir.

  • Kaynak değer zaten sayısalsa ve hedef tip, kabul edilen değer aralığında 0, -0e0 veya 0e0 içeren sayısal tipse ve kaynak sayısal değerin dökülmesi eksik akışa yol açacaksa, değer aşağıdaki şekillerde eşlenir:

    • Değer, ondalık hedef tipi için 0'a eşlenir.

    • Değer negatif bir alt akış olduğunda -0e0 ile eşlenir.

    • Değer, float veya çift hedef türü için pozitif bir alt akış olduğunda değer 0e0'a eşlenir.

    Hedef tip, değer alanında sıfır içermezse, atış başarısız olur ve sonuç boş dizisidir.

    Bir değeri xs:float, xs:double veya herhangi bir alt tipine dökmek, hassasiyeti kaybedebileceğini unutmayın.

Uygulama Sınırlamaları

Sınırlamalar şunlardır:

  • Kayan nokta değeri NaN desteklenmez.

  • Zararlanabilir değerler, hedef tip uygulama kısıtlamalarıyla sınırlandırılır. Örneğin, negatif yıl olan bir tarih dizisini xs:date olarak oluşturamazsınız. Bu tür dökümler, değer çalışma zamanında sağlanırsa boş diziyle sonuçlanır (çalışma zamanı hatası yaratmak yerine).