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.