Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
XQuery'de değer her zaman bir dizidir. Değerin türü bir dizi türü olarak adlandırılır. Sıra türü, XQuery ifadesinin
Atomik tür adı, türünde bir XQuery ifadesi olarak da kullanılabilir. SQL Server'da, ve
İşleç örneği
işlecinin
Expression instance of SequenceType[Occurrence indicator]
instance of işlecinin( Occurrence indicator) kardinaliteyi ve sonuçta elde edilen dizideki öğe sayısını belirttiğini unutmayın. Bu belirtilmezse kardinalitenin 1 olduğu varsayılır. SQL Server'da yalnızca soru işareti (?) oluşum göstergesi desteklenir.
? oluşum göstergesi, Expression'nin sıfır veya bir öğeyi döndürebileceğini gösterir.
? oluşum göstergesi belirtilirse, instance ofExpression türü belirtilen SequenceTypeile eşleştiğinde True döndürür. Expression tekil veya boş bir dizi döndürdüğünden bağımsız olarak.
? oluşum göstergesi belirtilmezse, sequence of yalnızca Expression türü belirtilen Type ile eşleştiğinde ve Expression tek bir değer döndürüldüğünde True döndürür.
Not SQL Server'da artı simgesi (+) ve yıldız işareti (*) oluşum göstergeleri desteklenmez.
Aşağıdaki örneklerde XQuery işleci örneğinin kullanımı gösterilmektedir .
Örnek A
Aşağıdaki örnek bir xml türü değişkeni oluşturur ve buna karşı bir sorgu belirtir. Sorgu ifadesi, birinci işlenen tarafından döndürülen değerin dinamik türünün ikinci işlenende belirtilen türle eşleşip eşleşmediğini belirlemek için bir instance of işleci belirtir.
125 değeri belirtilen türün bir örneği olduğundan, xs:integer
declare @x xml
set @x=''
select @x.query('125 instance of xs:integer')
go
İlk işlenende /a[1] ifadesi tarafından döndürülen değer bir öğe olduğundan aşağıdaki sorgu True döndürür:
declare @x xml
set @x='<a>1</a>'
select @x.query('/a[1] instance of element()')
go
Benzer şekilde, ilk ifadedeki ifadenin değer türü bir öznitelik olduğundan instance of aşağıdaki sorguda True döndürür:
declare @x xml
set @x='<a attr1="x">1</a>'
select @x.query('/a[1]/@attr1 instance of attribute()')
go
Aşağıdaki örnekte, data(/a[1]ifadesi xdt:untypedAtomic olarak yazılan bir atomik değer döndürür. Bu nedenle, instance of True döndürür.
declare @x xml
set @x='<a>1</a>'
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')
go
Aşağıdaki sorguda data(/a[1]/@attrAifadesi, yazılmamış bir atomik değer döndürür. Bu nedenle, instance of True döndürür.
declare @x xml
set @x='<a attrA="X">1</a>'
select @x.query('data(/a[1]/@attrA) instance of xdt:untypedAtomic')
go
Örnek B
Bu örnekte AdventureWorks örnek veritabanında yazılan xml sütununu sorgulaacaksınız. Sorgulanan sütunla ilişkilendirilmiş XML şema koleksiyonu, yazma bilgilerini sağlar.
**
İfade: data(), türü sütunla ilişkilendirilmiş şemaya göre xs:string olan ProductModelID özniteliğinin belirtilen değerini döndürür. Bu nedenle, instance of True döndürür.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
data(/PD:ProductDescription[1]/@ProductModelID) instance of xs:string
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Daha fazla bilgi için Yazılı XML'i Yazısız XML ile karşılaştırın, bkz..
Aşağıdaki sorgular, LocationID özniteliğinin xs:integer türünde olup olmadığını belirlemek için Boole instance of ifadesini kullanır:
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root[1]/AWMI:Location[1]/@LocationID instance of attribute(LocationID,xs:integer)
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
Aşağıdaki sorgu, CatalogDescription türündeki XML sütununda belirtilir. Bu sütunla ilişkilendirilmiş XML şema koleksiyonu yazma bilgileri sağlar.
Sorgu, element(ElementName, ElementType?) belirli bir ad ve türde bir öğe düğümü döndürdüğünü doğrulamak için instance of ifadesindeki /PD:ProductDescription[1] testini kullanır.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/PD:ProductDescription[1] instance of element(PD:ProductDescription, PD:ProductDescription?)
') as Result
FROM Production.ProductModel
where ProductModelID=19
Sorgu True döndürür.
Örnek C
Birleşim türleri kullanılırken, SQL Server'daki instance of ifadesinin bir sınırlaması vardır: Özellikle, bir öğenin veya özniteliğin türü birleşim türü olduğunda instance of tam türü belirlemeyebilir. Sonuç olarak, SequenceType'da kullanılan atomik türler simpleType hiyerarşisindeki ifadenin gerçek türünün en yüksek üst öğesi olmadığı sürece sorgu False döndürür. Başka bir ifadeyle, SequenceType içinde belirtilen atomik türlerin anySimpleType'ın doğrudan alt öğesi olması gerekir. Tür hiyerarşisi hakkında bilgi için bkz. XQuery'de Tür Atama Kuralları.
Sonraki sorgu örneği aşağıdakileri gerçekleştirir:
Tamsayı veya dize türü gibi birleşim türüne sahip bir XML şema koleksiyonu oluşturun.
XML şema koleksiyonunu kullanarak türü belirlenmiş bir xml değişkeni bildirin.
Değişkene örnek bir XML örneği atayın.
Birleşim türüyle ilgilenirken
instance ofdavranışını göstermek için değişkeni sorgulayın.
Bu sorgudur:
CREATE XML SCHEMA COLLECTION MyTestSchema AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
<simpleType name="MyUnionType">
<union memberTypes="integer string"/>
</simpleType>
<element name="TestElement" type="ns:MyUnionType"/>
</schema>'
Go
instance of ifadesinde belirtilen SequenceType belirtilen ifadenin gerçek türünün en yüksek üst öğesi olmadığından aşağıdaki sorgu False döndürür. Yani, <TestElement> değeri bir tamsayı türüdür. En üst düzey öğe xs:decimal'dir. Ancak, instance of işlecinin ikinci operandı olarak belirtilmez.
SET QUOTED_IDENTIFIER ON
DECLARE @var XML(MyTestSchema)
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'
SELECT @var.query('declare namespace ns="http://ns"
data(/ns:TestElement[1]) instance of xs:integer')
go
xs:integer öğesinin en yüksek üst öğesi xs:decimal olduğundan, sorguyu değiştirir ve sorguda SequenceType olarak xs:decimal değerini belirtirseniz sorgu True döndürür.
SET QUOTED_IDENTIFIER ON
DECLARE @var XML(MyTestSchema)
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'
SELECT @var.query('declare namespace ns="http://ns"
data(/ns:TestElement[1]) instance of xs:decimal')
go
Örnek D
Bu örnekte, önce bir XML şema koleksiyonu oluşturacak ve bunu kullanarak bir xml değişkeni yazacaksınız. Yazılan xml değişkeni, instance of işlevselliğini göstermek için sorgulanır.
Aşağıdaki XML şema koleksiyonu, myType türünde basit bir tür, myType ve <root>myType türünde bir öğe tanımlar:
drop xml schema collection SC
go
CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS"
xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
<import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
<simpleType name="myType">
<restriction base="s:varchar">
<maxLength value="20"/>
</restriction>
</simpleType>
<element name="root" type="ns:myType"/>
</schema>'
Go
Şimdi, yazılan bir xml değişkeni oluşturup bunu sorgulayın:
DECLARE @var XML(SC)
SET @var = '<root xmlns="myNS">My data</root>'
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";
declare namespace ns="myNS";
data(/ns:root[1]) instance of ns:myType')
go
myType türü sqltypes şemasında tanımlanan bir varchar türünden kısıtlamayla türetildiğinden, instance of de True döndürür.
DECLARE @var XML(SC)
SET @var = '<root xmlns="myNS">My data</root>'
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";
declare namespace ns="myNS";
data(/ns:root[1]) instance of sqltypes:varchar?')
go
Örnek E
Aşağıdaki örnekte ifade, IDREFS özniteliğinin değerlerinden birini alır ve değerin IDREF türünde olup olmadığını belirlemek için instance of kullanır. Örnek aşağıdakileri gerçekleştirir:
<
Customer> öğesinin OrderList IDREFS türü özniteliğine sahip olduğu ve <Order> öğesinin OrderID kimlik türü özniteliğine sahip olduğu bir XML şema koleksiyonu oluşturur.Yazılan bir xml değişkeni oluşturur ve buna örnek bir XML örneği atar.
değişkenine karşı bir sorgu belirtir. Sorgu ifadesi, ilk <
Customer>OrderList IDREFS tür özniteliğinden ilk sipariş kimliği değerini alır. Alınan değer IDREF türüdür. Bu nedenle,instance ofTrue döndürür.
create xml schema collection SC as
'<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:Customers="Customers" targetNamespace="Customers">
<element name="Customers" type="Customers:CustomersType"/>
<complexType name="CustomersType">
<sequence>
<element name="Customer" type="Customers:CustomerType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="OrderType">
<sequence minOccurs="0" maxOccurs="unbounded">
<choice>
<element name="OrderValue" type="integer" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</sequence>
<attribute name="OrderID" type="ID" />
</complexType>
<complexType name="CustomerType">
<sequence minOccurs="0" maxOccurs="unbounded">
<choice>
<element name="spouse" type="string" minOccurs="0" maxOccurs="unbounded"/>
<element name="Order" type="Customers:OrderType" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</sequence>
<attribute name="CustomerID" type="string" />
<attribute name="OrderList" type="IDREFS" />
</complexType>
</schema>'
go
declare @x xml(SC)
set @x='<CustOrders:Customers xmlns:CustOrders="Customers">
<Customer CustomerID="C1" OrderList="OrderA OrderB" >
<spouse>Jenny</spouse>
<Order OrderID="OrderA"><OrderValue>11</OrderValue></Order>
<Order OrderID="OrderB"><OrderValue>22</OrderValue></Order>
</Customer>
<Customer CustomerID="C2" OrderList="OrderC OrderD" >
<spouse>John</spouse>
<Order OrderID="OrderC"><OrderValue>33</OrderValue></Order>
<Order OrderID="OrderD"><OrderValue>44</OrderValue></Order>
</Customer>
<Customer CustomerID="C3" OrderList="OrderE OrderF" >
<spouse>Jane</spouse>
<Order OrderID="OrderE"><OrderValue>55</OrderValue></Order>
<Order OrderID="OrderF"><OrderValue>55</OrderValue></Order>
</Customer>
<Customer CustomerID="C4" OrderList="OrderG" >
<spouse>Tim</spouse>
<Order OrderID="OrderG"><OrderValue>66</OrderValue></Order>
</Customer>
<Customer CustomerID="C5" >
</Customer>
<Customer CustomerID="C6" >
</Customer>
<Customer CustomerID="C7" >
</Customer>
</CustOrders:Customers>'
select @x.query(' declare namespace CustOrders="Customers";
data(CustOrders:Customers/Customer[1]/@OrderList)[1] instance of xs:IDREF ? ') as XML_result
Uygulama Sınırlamaları
Sınırlamalar şunlardır:
schema-element() ve schema-attribute() sıra türleri,
instance ofişleciyle karşılaştırma için desteklenmez.Tam diziler, örneğin
(1,2) instance of xs:integer*desteklenmez.öğesi( dizisi türü) tür adı belirten
element(ElementName, TypeName)gibi bir form kullandığınızda, tür bir soru işareti (?) ile nitelenmelidir. Örneğin,element(Title, xs:string?)öğenin null olabileceğini gösterir. SQL Server, kullanılarakinstance ofözelliğinin çalışma zamanı algılamasını desteklemez.Expressiondeğeri birleşim olarak yazılmış bir öğeden veya öznitelikten geliyorsa, SQL Server yalnızca değerin türetildiği ilkel türü tanımlayabilir, türetilmiş türü tanımlayamaz. Örneğin, <e1> statik bir türüne (xs:integer | xs:string) sahip olarak tanımlanmışsa, aşağıdakiler False döndürür.data(<e1>123</e1>) instance of xs:integerAncak
data(<e1>123</e1>) instance of xs:decimalTrue döndürür.processing-instruction() ve document-node() sıra türleri için yalnızca bağımsız değişken içermeyen formlara izin verilir. Örneğin,
processing-instruction()izin verilir, ancakprocessing-instruction('abc')izin verilmez.
Operator olarak çevir
bir değeri belirli bir veri türüne dönüştürmek için ifadesi olarak yayınlanabilir. Örneğin:
Expression cast as AtomicType?
SQL Server'da soru işareti (?) AtomicTypesonra gereklidir. Örneğin, aşağıdaki sorguda gösterildiği gibi "2" cast as xs:integer? dize değerini tamsayıya dönüştürür:
declare @x xml
set @x=''
select @x.query('"2" cast as xs:integer?')
Aşağıdaki sorguda, data() ifadesi, bir dize türündeki ProductModelID özniteliğinin yazılı değerini döndürür.
cast as işleci değeri xs:integer değerine dönüştürür.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)
SELECT CatalogDescription.query('
data(/PD:ProductDescription[1]/@ProductModelID) cast as xs:integer?
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Bu sorguda data() açıkça kullanılması gerekli değildir.
cast as ifadesi, giriş ifadesinde örtük atomizasyon gerçekleştirir.
Oluşturucu İşlevleri
Atomik tür oluşturucu işlevlerini kullanabilirsiniz. Örneğin, cast as işlecini kullanmak yerine "2" cast as xs:integer?, aşağıdaki örnekte olduğu gibi xs:integer() oluşturucu işlevini kullanabilirsiniz:
declare @x xml
set @x=''
select @x.query('xs:integer("2")')
Aşağıdaki örnek, 2000-01-01Z'ye eşit bir xs:date değeri döndürür.
declare @x xml
set @x=''
select @x.query('xs:date("2000-01-01Z")')
Kullanıcı tanımlı atomik türler için oluşturucuları da kullanabilirsiniz. Örneğin, XML veri türüyle ilişkili XML şema koleksiyonu basit bir tür tanımlıyorsa, bu türdeki bir değeri döndürmek için myType() oluşturucu
Uygulama Sınırlamaları
typeswitch, castableve treat ifadeleri XQuery için desteklenmez.
olarak atanması, atomik türden sonra bir soru işareti (?) gerektirir.
xs:QName tür olarak dönüştürme için desteklenmez. Bunun yerine expanded-QName kullanın.
xs:date, xs:timeve xs:datetime, Z ile gösterilen bir saat dilimi gerektirir.
Saat dilimi belirtilmediğinden aşağıdaki sorgu başarısız olur.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>') goDeğere Z saat dilimi göstergesini ekleyerek sorgu çalışır.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>') goSonuç şu şekildedir:
<a>2002-05-25Z</a>
Ayrıca Bkz.
XQuery İfadeleri
Tür Sistemi (XQuery)