Sıra ifadeleri (XQuery)
SQL Serveroluşturmak, filtre ve bir dizi öğeleri birleştirmek için kullanılan XQuery işleçleri destekler. Bir öğeyi bir atomik değeri veya düğüm olabilir.
Sıralar oluşturma
Öğeleri tek bir sıra birleştirir bir sıra oluşturmak için virgül operatörünü kullanabilirsiniz.
Bir dizi yinelenen değerler içeriyor. İç içe diziler, bir sıra içinde bir sıra daraltılır. Örneğin, sıra (1, 2, (3, 4, (5))) olur (1, 2, 3, 4, 5). Bu örnekler oluşturma dizileri vardır.
Örnek a
Aşağıdaki sorgu beş atomik değerleri dizisi döndürür:
declare @x xml
set @x=''
select @x.query('(1,2,3,4,5)')
go
-- result 1 2 3 4 5
declare @x xml
set @x=''
select @x.query('(1,2,3,4,5)')
go
-- result 1 2 3 4 5
Aşağıdaki sorguyu iki düğüm dizisi döndürür:
-- sequence of 2 nodes
declare @x xml
set @x=''
select @x.query('(<a/>, <b/>)')
go
-- result
<a />
<b />
-- sequence of 2 nodes
declare @x xml
set @x=''
select @x.query('(<a/>, <b/>)')
go
-- result
<a />
<b />
Çünkü atomik değerleri ve düğüm dizisi yapılandırırlar aşağıdaki sorgu hata verir. Bu heterojen bir sıra ve desteklenmez.
declare @x xml
set @x=''
select @x.query('(1, 2, <a/>, <b/>)')
go
declare @x xml
set @x=''
select @x.query('(1, 2, <a/>, <b/>)')
go
Örnek b
Aşağıdaki sorgu, dört farklı uzunlukta bir tek sıra halinde dizileri birleştirerek atomik değerleri dizisi oluşturur.
declare @x xml
set @x=''
select @x.query('(1,2),10,(),(4, 5, 6)')
go
-- result = 1 2 10 4 5 6
declare @x xml
set @x=''
select @x.query('(1,2),10,(),(4, 5, 6)')
go
-- result = 1 2 10 4 5 6
Sıra flowr ve order by kullanarak sıralayabilirsiniz:
declare @x xml
set @x=''
select @x.query('for $i in ((1,2),10,(),(4, 5, 6))
order by $i
return $i')
go
declare @x xml
set @x=''
select @x.query('for $i in ((1,2),10,(),(4, 5, 6))
order by $i
return $i')
go
Öğeleri sırayla kullanarak güvenebilirsiniz fn:count() işlevi.
declare @x xml
set @x=''
select @x.query('count( (1,2,3,(),4) )')
go
-- result = 4
declare @x xml
set @x=''
select @x.query('count( (1,2,3,(),4) )')
go
-- result = 4
Örnek c
Aşağıdaki sorgu karşı AdditionalContactInfo sütun belirtilen xmltürü ilgili kişi tablosundaki. Bu sütun, bir veya daha fazla ek telefon numaraları, çağrı numaralarını ve adresleri gibi ek iletişim bilgilerini depolar. <TelephoneNumber>, <çağrı>, ve diğer düğümler belgede herhangi bir yerde görünebilir. Sorgu tümünü içeren bir dizi oluşturur <telephoneNumber> ardından içerik düğümünün <çağrı> çocuklar. Return ifadesi virgül sıra işleci kullanın ($a//act:telephoneNumber, $a//act:pager).
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)
SELECT AdditionalContactInfo.query('
for $a in /aci:AdditionalContactInfo
return ($a//act:telephoneNumber, $a//act:pager)
') As Result
FROM Person.Contact
WHERE ContactID=3
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)
SELECT AdditionalContactInfo.query('
for $a in /aci:AdditionalContactInfo
return ($a//act:telephoneNumber, $a//act:pager)
') As Result
FROM Person.Contact
WHERE ContactID=3
Sonuç şudur:
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
<act:number>333-333-3333</act:number>
</act:telephoneNumber>
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
<act:number>333-333-3334</act:number>
</act:telephoneNumber>
<act:pager xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
<act:number>999-555-1244</act:number>
<act:SpecialInstructions>
Page only in case of emergencies.
</act:SpecialInstructions>
</act:pager>
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
<act:number>333-333-3333</act:number>
</act:telephoneNumber>
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
<act:number>333-333-3334</act:number>
</act:telephoneNumber>
<act:pager xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
<act:number>999-555-1244</act:number>
<act:SpecialInstructions>
Page only in case of emergencies.
</act:SpecialInstructions>
</act:pager>
Sequences süzme
İfade bir yüklemi ekleyerek bir deyim tarafından döndürülen sıra filtre uygulayabilirsiniz. Daha fazla bilgi için, bkz. Yol ifadeleri (XQuery). Örneğin, aşağıdaki sorgu üç dizisi döndürür <a> öğesi düğümleri:
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a')
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a')
Sonuç şudur:
<a attrA="1">111</a>
<a />
<a />
<a attrA="1">111</a>
<a />
<a />
Sadece almak için <a> özniteliği attrA sahip öğeleri filtre yüklemi belirleyebilirsiniz. Elde edilen sıra yalnızca biri olacak <a> öğesi.
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a[@attrA]')
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a[@attrA]')
Sonuç şudur:
<a attrA="1">111</a>
<a attrA="1">111</a>
Bir yol ifadesi yüklemler belirtme hakkında daha fazla bilgi için bkz: Yol ifadesi adım doğrulamaları belirtme.
Aşağıdaki örnek, ağaçların bir sıra ifade oluşturur ve sonra sıra filtre uygular.
declare @x xml
set @x = '
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
<c>top level c</c>
<d></d>
'
declare @x xml
set @x = '
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
<c>top level c</c>
<d></d>
'
İfade (/a, /b)bir sıra ile alt ağaçlar yapıları /ave /bve sonuç serisinden ifade filtre elemanı <c>.
SELECT @x.query('
(/a, /b)/c
')
SELECT @x.query('
(/a, /b)/c
')
Sonuç şudur:
<c>C under a</c>
<c>C under b</c>
<c>C under a</c>
<c>C under b</c>
Aşağıdaki örnek, bir koşul filtre uygular. İfade öğeleri bulur <a> ve <b> öğesi içeren <c>.
declare @x xml
set @x = '
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
<c>top level c</c>
<d></d>
'
SELECT @x.query('
(/a, /b)[c]
')
declare @x xml
set @x = '
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
<c>top level c</c>
<d></d>
'
SELECT @x.query('
(/a, /b)[c]
')
Sonuç şudur:
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
Uygulama kısıtlamaları
Bu sınırlamalar şunlardır:
XQuery aralığı ifade desteklenmiyor.
Dizileri homojen olması gerekir. Özellikle, tüm öğeleri bir sıra düğümler ya da atomik değerleri olmalıdır. Bu statik olarak denetlenir.
Birleşen düğüm dizileri kullanarak Birliği kesişen veya işleci desteklenmiyor.