Megosztás:


Sorozatkifejezések (XQuery)

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.

Lásd még:

XQuery-kifejezések