Udostępnij za pośrednictwem


Wyrażenia sekwencji (XQuery)

Dotyczy:programu SQL Server

Program SQL Server obsługuje operatory XQuery używane do konstruowania, filtrowania i łączenia sekwencji elementów. Element może być wartością niepodzieną lub węzłem.

Konstruowanie sekwencji

Możesz użyć operatora przecinka, aby skonstruować sekwencję, która łączy elementy w jedną sekwencję.

Sekwencja może zawierać zduplikowane wartości. Zagnieżdżone sekwencje, sekwencja w sekwencji, są zwinięte. Na przykład sekwencja (1, 2, (3, 4, (5))) staje się (1, 2, 3, 4, 5). Są to przykłady konstruowania sekwencji.

Przykład A

Następujące zapytanie zwraca sekwencję pięciu wartości niepodzielnych:

declare @x xml  
set @x=''  
select @x.query('(1,2,3,4,5)')  
go  
-- result 1 2 3 4 5  

Następujące zapytanie zwraca sekwencję dwóch węzłów:

-- sequence of 2 nodes  
declare @x xml  
set @x=''  
select @x.query('(<a/>, <b/>)')  
go  
-- result  
<a />  
<b />  

Poniższe zapytanie zwraca błąd, ponieważ tworzysz sekwencję wartości niepodzielnych i węzłów. Jest to sekwencja heterogeniczna i nie jest obsługiwana.

declare @x xml  
set @x=''  
select @x.query('(1, 2, <a/>, <b/>)')  
go  

Przykład B

Poniższe zapytanie konstruuje sekwencję wartości niepodzielnych, łącząc cztery sekwencje o różnej długości w jedną sekwencję.

declare @x xml  
set @x=''  
select @x.query('(1,2),10,(),(4, 5, 6)')  
go  
-- result = 1 2 10 4 5 6  

Sekwencję można sortować przy użyciu usługi FLOWR i ORDER BY:

declare @x xml  
set @x=''  
select @x.query('for $i in ((1,2),10,(),(4, 5, 6))  
                  order by $i  
                  return $i')  
go  

Elementy w sekwencji można policzyć przy użyciu funkcji fn:count().

declare @x xml  
set @x=''  
select @x.query('count( (1,2,3,(),4) )')  
go  
-- result = 4  

Przykład C

Następujące zapytanie jest określone względem kolumny AdditionalContactInfo xml w tabeli Contact. Ta kolumna przechowuje dodatkowe informacje kontaktowe, takie jak jeden lub więcej dodatkowych numerów telefonów, numerów stron i adresów. <phoneNumber>, <pager>, a inne węzły mogą być wyświetlane w dowolnym miejscu dokumentu. Zapytanie tworzy sekwencję zawierającą wszystkie <phoneNumber> elementów podrzędnych węzła kontekstu, a następnie <pager> elementów podrzędnych. Zwróć uwagę na użycie operatora sekwencji przecinka w wyrażeniu zwrotnym, ($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  

Jest to wynik:

<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>  

Sekwencje filtrowania

Sekwencję zwracaną przez wyrażenie można filtrować, dodając predykat do wyrażenia. Aby uzyskać więcej informacji, zobacz Path Expressions (XQuery). Na przykład następujące zapytanie zwraca sekwencję trzech węzłów <a> elementów:

declare @x xml  
set @x = '<root>  
<a attrA="1">111</a>  
<a></a>  
<a></a>  
</root>'  
SELECT @x.query('/root/a')  

Jest to wynik:

<a attrA="1">111</a>  
<a />  
<a />  

Aby pobrać tylko <a> elementów, które mają attrA atrybutu, można określić filtr w predykacie. Wynikowa sekwencja będzie zawierać tylko jeden element <a>.

declare @x xml  
set @x = '<root>  
<a attrA="1">111</a>  
<a></a>  
<a></a>  
</root>'  
SELECT @x.query('/root/a[@attrA]')  

Jest to wynik:

<a attrA="1">111</a>  

Aby uzyskać więcej informacji na temat określania predykatów w wyrażeniu ścieżki, zobacz Określanie predykatów w kroku wyrażenia ścieżki.

Poniższy przykład tworzy wyrażenie sekwencji poddrzew, a następnie stosuje filtr do sekwencji.

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>  
'  

Wyrażenie w (/a, /b) tworzy sekwencję z poddrzewami /a i /b oraz z wynikowej sekwencji element wyrażenia filtruje element <c>.

SELECT @x.query('  
  (/a, /b)/c  
')  

Jest to wynik:

<c>C under a</c>  
<c>C under b</c>  

W poniższym przykładzie zastosowano filtr predykatu. Wyrażenie znajduje elementy <a> i <b>, które zawierają element <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]  
')  

Jest to wynik:

<a>  
  <c>C under a</c>  
</a>  
<b>  
  <c>C under b</c>  
</b>  

Ograniczenia implementacji

Są to ograniczenia:

  • Wyrażenie zakresu XQuery nie jest obsługiwane.

  • Sekwencje muszą być jednorodne. W szczególności wszystkie elementy w sekwencji muszą być węzłami lub wartościami niepodzielnych. Jest to statycznie sprawdzane.

  • Łączenie sekwencji węzłów przy użyciu unii, przecięć lub z wyjątkiem operatora nie jest obsługiwane.

Zobacz też

wyrażenia XQuery