Share via


XQuery'da türü çevrim kuralları

Aşağıdaki W3C XQuery 1.0, XPath 2.0 işlevler ve işleçler belirtimleri şemada yerleşik veri türlerini gösterir.Bu, yerleşik temel ve yerleşik türetilen türler içerir.

XQuery 1.0 type hierarchy

Bu konu, bir türden diğerine aşağıdaki yöntemlerden birini kullanarak çevrim uygulanır türü çevrim kuralları açıklar:

  • Bunu kullanarak açık tür atama olarak atama ya da tür Oluşturucu işlevleri (örneğin, xs:integer("5")).

  • Örtülü çevrim türü yükseltme sırasında oluşur.

Açık tür atama

Aşağıdaki tablo yerleşik basit türler arasında izin verilen tür çevrim özetlenir.

Describes casting rules for XQuery.

  • Yerleşik bir basit tür tablosundaki kurallarını temel alan başka bir yerleşik temel türüne çevirebilirsiniz.

  • Bir basit tür için bu temel türünden türetilen herhangi bir tür çevirebilirsiniz.Örneğin, gelen çevirebilirsiniz xs:decimal to xs:Integer, or from xs:decimal to xs:Long.

  • Türetilmiş BIR tür, üst türü sıradüzeninde en yerleşik temel temel türünü kadar türüne çevirebilirsiniz.Örneğin, gelen çevirebilirsiniz xs:Token to xs:normalizedString or to xs:dize.

  • Temel, üst hedef türe atama, türetilmiş türü bir basit tür için çevirebilirsiniz.Örneğin, atama xs:Integer bir türetilmiş bir türxs:dize, basit tür, çünkü xs:decimal, xs:Integeriçin ait temel üst atamaxs:dize.

  • Kaynak türü temel üst için hedef türü temel üst atama, türetilmiş BIR tür başka bir türev türüne çevirebilirsiniz.Örneğin, gelen çevirebilirsiniz xs:Integer to xs:Tokençevirebilirsiniz, çünkü xs:decimal to xs:dize.

  • Kullanıcı tanımlı türler için yerleşik türleri çevrim kurallarını yerleşik türleri aynıdır.Örneğin, tanımlama bir myInteger Türetilmiş türüxs:Integer türü.Sonra myInteger için atamaxs:Token, because xs:decimal için atamaxs:dize.

Çevrim aşağıdaki türleri desteklenir:

  • Çevrim için veya liste türleri verilmez.Bu kullanıcı tanımlı liste türleri hem de gibi yerleşik liste türleri içerir xs:IDREFS, xs:ENTITIES, and xs:NMTOKENS.

  • Çevrim veya xs:QName desteklenmiyor.

  • xs:NOTATION ve tam olarak sipariş edilen alt türlerinden'süresinin XDT:yearMonthDuration and XDT:dayTimeDurationdesteklenmez.Sonuç olarak, atama için veya bu tür desteklenmiyor.

Aşağıdaki örnekte, açık tür çevrim görülmektedir.

Örnek A

Aşağıdaki örnek, bir xml türü değişkeni sorgular.Sorgu, bir basit tür değeri bir dizi xs:dize yazılan 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, yazılan bir xml değişken sorgular.Ilk örnekte, bir XML şema koleksiyon oluşturur.Klavyeyle yazılan bir xml değişken oluşturmak için XML şema koleksiyon sonra kullanır.Şema değişkenine atanan XML örnek için yazma bilgileri sağlar.Sorgu değişken karşı sonra belirtilmedi.

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

Kaç üst düzey tanımadığınız için aşağıdaki sorgu statik bir hata verir... <root> öğeleri belgeye olan örnek.

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

Tek belirterek <root> ifade, sorgu öğesinde başarılı olur. Sorgu, bir basit tür değeri bir dizi xs:dize yazılan 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 türü değişkeni XML şema koleksiyon belirten bir belge anahtar içerir.Bu, XML örnek için tek bir üst düzey öğesi olan bir belgeyi olması gerektiğini gösterir.Iki oluşturursanız <root> öğeleri XML örnek bir hata döndürecektir.

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

Yalnızca bir üst düzey öğesi ve sorgu çalışır örneğin değiştirebilirsiniz.Bir basit tür değeri bir dizi xs:dize yazılan sorgu yeniden 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

Örtülü atama

Örtülü çevrim, yalnızca sayısal türleri ve türlenmemiş atomik türleri için izin verilir.Örneğin, aşağıdaki Min() işlev en az iki değer döndürür:

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

Bu örnekte, iki değeri için XQuery geçirilen Min() işlev farklı olur.Bu nedenle, örtülü dönüşüm işlemi burada tamsayı türü için yükseltilirçift ve iki çift değerleri karşılaştırılır.

Bu örnekte açıklandığı gibi türü yükseltmesi şu kuralları uygular:

  • Yerleşik bir türev sayısal tür temel türünü yükseltilmesi.Örneğin, tamsayı için yükseltilmesiondalık.

  • C ondalık için yükseltilmesifloat, and a float için yükseltilmesiçift.

Örtülü çevrim sayısal türleri için izin verilen olduğundan, aşağıdaki izin verilmiyor:

  • Örtülü çevrim dize türleri için izin verilmez.Örneğin, iki dize türleri beklenen ve içinde bir geçmesidize and a Token, örtülü hiçbir çevrim oluşur ve bir hata döndürdü.

  • Sayısal türlerinden örtülü çevrim dize türleri için izin verilmez.Örneğin, bir dize türü parametresi bekleniyor bir işlev için bir Tamsayı türü değeri geçirirseniz, örtülü hiçbir çevrim oluşur ve bir hata döndürdü.

Çevrim değerleri

Fiili değerler kaynak türünün değer alanı, bir türden diğerine çevrim, hedef türü değeri alanı dönüştürülür.Örneğin, bir xs:decimal kullanılarak bir xs:double çevrim çift bir değer ondalık değer dönüştürme.

Dönüştürme kuralların bazıları şunlardır.

Değer bir dize veya untypedAtomic türden çevrim

Değer bir dize veya untypedAtomic tür atama, hedef türü kurallara dayalı bir değeri doğrulama olarak aynı şekilde dönüştürülür.Bu, ileride deseni ve beyaz boşluk işleme kuralları içerir.Örneğin, aşağıdaki başarılı ve çift bir değer oluşturmak 1.1e0:

xs:double("1.1")

Ikili türlerine xs:base64Binary veya xs:hexBinary gibi bir dize veya untypedAtomic türünden çevrim, giriş değerleri base64 veya onaltılık kodlanmış, sırasıyla olması gerekir.

Değer bir dize veya untypedAtomic tipine çevrim

Bir dize veya untypedAtomic çevrim türü, XQuery kurallı sözlü gösterimi değerine dönüştürür.Bu bir değeri belirli bir desen veya başka bir kısıtlama Giriş sırasında obeyed Bu kısıtlamaya göre temsil değil, özellikle gelebilir.Kullanıcıların bu konuda bilgilendirmek için SQL Server Burada tür kısıtlaması bir uyarı sağlayarak bu tip şema koleksiyonuna yüklendiğinde bir sorun olabilir türleri işaretler.

Değer, değeri türü xs:float xs:double veya bir dize veya untypedAtomic türü için kendi alt türlerinden birini çevrim, bilimsel gösterimde temsil edilir.Bu, yalnızca değerin mutlak değeri az 1.0E - 6 veya büyük 1.0E6 eşit olduğunda gerçekleştirilir.Bu, 0.0E0 için bilimsel gösterimde 0 serileştirilir anlamına gelir.

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

Ikili türlerini (örneğin, xs:base64Binary veya bir dize veya untypedAtomic türüne, xs:hexBinary çevrim ikili değerler, base64 temsil edilen veya kodlanmış form, sırasıyla onaltılı.

Bir sayısal tür değerine çevrim

Bir sayısal tür değeri için başka bir sayısal tür değeri çevrim, değeri bir değer alanı diğer dize seri hale getirme olmadan eşleştirilir.Değer bir Hedef türündeki kısıtlama karşılamak için aşağıdaki kurallar uygulanır:

  • Kaynak zaten sayısal değerdir ve hedef türü xs:float ya da alt-sağlayan bir tür nin bu durumdan INF veya INF bir Taşma alanındaki değerler ve kaynak sayısal değerin çevrim neden olacaktır, değer, negatif ise pozitif bir değer ise INF veya INF - değeri eşleştirilir.INF veya INF hedef türü izin vermiyor ve bir taşma ortaya çıkabilecek dönüþtürme başarısız olur ve SQL Server'ın bu sürümdeki boş sırası sonucudur.

  • Değer, kaynak zaten sayısal değerdir ve hedef türü 0 içeren bir sayısal türüdür - 0e0 veya 0e0, kabul edilen değer aralık ve kaynak sayısal değerin çevrim içinde bir Yetersizlik durumu neden olacaktır, aşağıdaki yollarla eşleştirilir:

    • Değer 0'ın bir ondalık hedef türü için eşleştirilir.

    • Değer, değer, negatif bir Yetersizlik durumu olduğunda 0e0-eşleştirilir.

    • Değer, pozitif bir Yetersizlik durumu float veya double hedef türü için olduğunda 0e0 için eşleştirilir.

    Hedef türü, Değer alanında sıfır içermiyorsa, dönüþtürme başarısız olur ve boş sırası sonucudur.

    Xs:float xs:double ya da kendi alt türlerinden birini noktası türü, değişken ikili değerine çevrim duyarlık kaybedebilirsiniz unutmayın.

Uygulama kısıtlamaları

Sınırlamaları şunlardır:

  • Kayan nokta değeri NaN desteklenmiyor.

  • Castable değerleri hedef türler uygulama kısıtlamaları tarafından kısıtlanır.Örneğin, negatif bir yıl için bir tarih dizesi artığını olamaz xs:date. Değeri, zamanında (yerine, bir çalışma zamanı hatası'ı yükseltme) sağlanırsa, tür yayınları boş sırayla neden olur.

See Also

Other Resources