Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A következőkre vonatkozik:SQL Server
Az SQL Server támogatja az elemek sorozatának létrehozásához, szűréséhez és kombinálásához használt XQuery-operátorokat. Az elemek lehetnek atomértékek vagy csomópontok.
Sorozatok létrehozása
A vessző operátorral olyan sorozatot hozhat létre, amely egyetlen sorozatba fűzi össze az elemeket.
A sorozatok ismétlődő értékeket tartalmazhatnak. A beágyazott sorozatok, amelyek egy sorozaton belül vannak, össze vannak csukva. A sorozat (1, 2, (3, 4, (5))) például (1, 2, 3, 4, 5) lesz. Ezek a szekvenciák létrehozásának példái.
A példa
A következő lekérdezés öt atomértékből álló sorozatot ad vissza:
declare @x xml
set @x=''
select @x.query('(1,2,3,4,5)')
go
-- result 1 2 3 4 5
A következő lekérdezés két csomópontból álló sorozatot ad vissza:
-- sequence of 2 nodes
declare @x xml
set @x=''
select @x.query('(<a/>, <b/>)')
go
-- result
<a />
<b />
Az alábbi lekérdezés hibát ad vissza, mert atomi értékek és csomópontok sorozatát hozza létre. Ez heterogén sorozat, és nem támogatott.
declare @x xml
set @x=''
select @x.query('(1, 2, <a/>, <b/>)')
go
B példa
Az alábbi lekérdezés az atomértékek sorozatát állítja össze úgy, hogy négy különböző hosszúságú sorozatot egyetlen sorozatba egyesít.
declare @x xml
set @x=''
select @x.query('(1,2),10,(),(4, 5, 6)')
go
-- result = 1 2 10 4 5 6
A folyamatütemezést a FLOWR és az ORDER BY használatával rendezheti:
declare @x xml
set @x=''
select @x.query('for $i in ((1,2),10,(),(4, 5, 6))
order by $i
return $i')
go
A sorozat elemeit az fn:count() függvénnyel lehet megszámolni.
declare @x xml
set @x=''
select @x.query('count( (1,2,3,(),4) )')
go
-- result = 4
C példa
A következő lekérdezést a xml- típus AdditionalContactInfo oszlopában adhatja meg a Partner táblában. Ez az oszlop további kapcsolattartási adatokat, például egy vagy több további telefonszámot, oldalszámokat és címeket tárol. A <telephoneNumber>, <pager>és más csomópontok bárhol megjelenhetnek a dokumentumban. A lekérdezés egy olyan sorozatot hoz létre, amely a környezeti csomópont összes <telephoneNumber> gyermekét tartalmazza, majd a <lapozó> gyermekeket. Figyelje meg a vesszősorozat-operátor használatát a visszatérési kifejezésben, ($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
Ez az eredmény:
<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>
Szűrési sorozatok
A kifejezés által visszaadott sorozat szűréséhez adjon hozzá egy predikátumot a kifejezéshez. További információ: Path Expressions (XQuery). A következő lekérdezés például három <a> elemcsomópontból álló sorozatot ad vissza:
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a')
Ez az eredmény:
<a attrA="1">111</a>
<a />
<a />
Ha csak <a> attrA attribútummal rendelkező elemeket szeretne lekérni, megadhat egy szűrőt a predikátumban. Az eredményként kapott sorozatnak csak egy <a> eleme lesz.
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a[@attrA]')
Ez az eredmény:
<a attrA="1">111</a>
Az elérésiút-kifejezések predikátumainak megadásáról további információt a Predikátumok megadása az elérésiút-kifejezés lépésbencímű témakörben talál.
Az alábbi példa egy részhalmazok sorozatkifejezését hozza létre, majd szűrőt alkalmaz a sorozatra.
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>
'
A (/a, /b) kifejezés /a és /b részösszegeket tartalmazó sorozatot hoz létre, és az eredményül kapott sorozatból a kifejezés az <c>elemet szűri.
SELECT @x.query('
(/a, /b)/c
')
Ez az eredmény:
<c>C under a</c>
<c>C under b</c>
Az alábbi példa predikátumszűrőt alkalmaz. A kifejezés olyan elemeket keres, <a> és <b>, amelyek <c>elemet tartalmaznak.
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]
')
Ez az eredmény:
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
Megvalósítási korlátozások
Ezek a korlátozások:
Az XQuery-tartománykifejezés nem támogatott.
A sorozatoknak homogénnek kell lenniük. Pontosabban a sorozat összes elemének csomópontoknak vagy atomértékeknek kell lennie. Ezt a rendszer statikusan ellenőrzi.
A csomópontütemezések egyesítése az egyesítés, a metszet vagy a kivételével operátor használatával nem támogatott.