Tip Sistemi (XQuery)

Şunlar için geçerlidir: SQL Server

XQuery, şema tipleri için güçlü tipli bir dil ve tipsiz veriler için zayıf tipli bir dildir. Önceden tanımlanmış XQuery türleri şunlardır:

Bu konu ayrıca aşağıdakileri de açıklar:

Yerleşik XML şema türleri

XML şemasının yerleşik türleri, önceden tanımlanmış bir ad alanı öneki olan xs'ye sahiptir. Bu türlerden bazıları xs:integer ve xs:string'dir. Tüm bu yerleşik tipler desteklenmektedir. Bu türleri XML şema koleksiyonu oluştururken kullanabilirsiniz.

Tiplenmiş XML sorgularken, düğümlerin statik ve dinamik tışı, sorgulanan sütun veya değişkenle ilişkili XML şema koleksiyonu tarafından belirlenir. Statik ve dinamik tipler hakkında daha fazla bilgi için Expression Context and Inquiry Evaluation (XQuery) sayfasına bakınız. Örneğin, aşağıdaki sorgu, tiplenmiş bir xml sütununa karşı belirtilmiştir (Instructions). İfade, döndürülen xs:decimal özniteliğin tipli LotSize değerinin tipte olduğunu doğrulamak için kullanılırinstance of.

SELECT Instructions.query('  
   DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Bu tipleme bilgisi, sütunla ilişkili XML şema koleksiyonu tarafından sağlanır.

XPath Veri Tipleri İsim Alanında Tanımlanan Türler

İsim alanında tanımlanan http://www.w3.org/2004/07/xpath-datatypes türlerin önceden tanımlanmış bir öneki xdt'dir. Bu türler için aşağıdakiler geçerlidir:

  • Bu türleri XML şema koleksiyonu oluştururken kullanamazsınız. Bu tipler XQuery tip sisteminde kullanılır ve XQuery ile Statik Tipleme için de kullanılır. Xdt isim alanında örneğin xdt:untypedAtomic gibi atomik tiplere dökebilirsiniz.

  • Tiplenmemiş XML sorguladığında, element düğümlerinin statik ve dinamik tipi xdt:untyped, öznitelik değerlerinin türü ise xdt:untypedAtomic'dir. Bir query() yönteminin sonucu tipsiz XML üretir. Bu, XML düğümlerinin sırasıyla xdt:untyped ve xdt:untypedAtomic olarak geri döndüğü anlamına gelir.

  • xdt:dayTimeDuration ve xdt:yearMonthDuration türleri desteklenmez.

Aşağıdaki örnekte, sorgu tiplenmemiş bir XML değişkenine karşı belirtilmiştir. İfade, data(/a[1]), bir atomik değerden oluşan bir diziyi döndürür. Fonksiyon, data() elemanın <a>tiplenmiş değerini döndürür. Sorgulanan XML tipsiz olduğundan, döndürülen değerin türü 'dir.xdt:untypedAtomic Bu nedenle, instance of doğru döner.

DECLARE @x xml  
SET @x='<a>20</a>'  
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )  

Aşağıdaki örnekte tiplenen değeri almak yerine, ifadesi (/a[1]) bir eleman, eleman <a>dizisini geri getirir. İfade, instance of ifade tarafından geri dönen değerin bir eleman düğümü olduğunu xdt:untyped typedoğrulamak için eleman testini kullanır.

DECLARE @x xml  
SET @x='<a>20</a>'  
-- Is this an element node whose name is "a" and type is xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')  
-- Is this an element node of type xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')  
-- Is this an element node?  
SELECT @x.query( '/a[1] instance of element()')  

Note

Tiplenmiş bir XML örneğini sorguladığınızda ve sorgu ifadesi ana ekseni içerdiğinde, ortaya çıkan düğümlerin statik tip bilgisi artık mevcut değildir. Ancak, dinamik tip hâlâ düğümlerle ilişkilidir.

Tiplenen Değer vs. Dize Değeri

Her düğümün bir tipli değeri ve bir dizi değeri vardır. Tiplenen XML veri için, tiplenen değerin türü, sorgulanan sütun veya değişkenle ilişkili XML şema koleksiyonu tarafından sağlanır. Tiplenmemiş XML veri için, tiplenen değerin türü xdt:untypedAtomic'tir.

Bir düğümün değerini almak için data() veya string() fonksiyonunu kullanabilirsiniz:

Aşağıdaki XML şema koleksiyonunda, <root> tam sayı tipinin elemanı tanımlanmıştır:

CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="integer"/>  
</schema>'  
GO  

Aşağıdaki örnekte, ifade önce tiplenen değeri alır /root[1] ve ardından ona ekler 3 .

DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('data(/root[1]) + 3')  

Bir sonraki örnekte, ifade başarısız olur, çünkü string(/root[1]) ifadedeki ifade bir dizi türü değeri döndürür. Bu değer, yalnızca sayısal tip değerlerini operandları alan bir aritmetik operatöre iletilir.

-- Fails because the argument is string type (must be numeric primitive type).  
DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('string(/root[1]) + 3')  

Aşağıdaki örnek, özniteliklerin LaborHours toplamını hesaplar. Fonksiyon, data() bir ürün modeli için tüm <Location> elemanlardan tiplenen öznitelik LaborHours değerlerini alır. Sütunla Instruction ilişkili XML şemasına göre, LaborHoursxs:ondalık türdendir.

SELECT Instructions.query('   
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";   
             sum(data(//AWMI:Location/@LaborHours))   
') AS Result   
FROM Production.ProductModel   
WHERE ProductModelID=7  

Bu sorgu sonuç olarak 12.75 döndürür.

Note

Bu örnekte data() fonksiyonunun açık kullanımı sadece örnek içindir. Belirtilmemişse, sum() düğümlerin tiplenen değerlerini çıkarmak için data () fonksiyonunu örtük olarak uygular.