Sequence Expressions (XQuery)
platí pro:SQL Server
SQL Server podporuje operátory XQuery, které se používají k vytváření, filtrování a kombinování posloupnosti položek. Položka může být atomická hodnota nebo uzel.
Vytváření sekvencí
Pomocí operátoru čárky můžete vytvořit sekvenci, která zřetězí položky do jedné sekvence.
Sekvence může obsahovat duplicitní hodnoty. Vnořené sekvence, posloupnost v rámci sekvence, jsou sbalené. Například posloupnost (1, 2, (3, 4, (5))) se stane (1, 2, 3, 4, 5). Jedná se o příklady vytváření sekvencí.
Příklad A
Následující dotaz vrátí posloupnost pěti atomických hodnot:
declare @x xml
set @x=''
select @x.query('(1,2,3,4,5)')
go
-- result 1 2 3 4 5
Následující dotaz vrátí posloupnost dvou uzlů:
-- sequence of 2 nodes
declare @x xml
set @x=''
select @x.query('(<a/>, <b/>)')
go
-- result
<a />
<b />
Následující dotaz vrátí chybu, protože vytváříte posloupnost atomických hodnot a uzlů. Jedná se o heterogenní sekvenci a nepodporuje se.
declare @x xml
set @x=''
select @x.query('(1, 2, <a/>, <b/>)')
go
Příklad B
Následující dotaz vytvoří sekvenci atomických hodnot kombinováním čtyř sekvencí různé délky do jedné sekvence.
declare @x xml
set @x=''
select @x.query('(1,2),10,(),(4, 5, 6)')
go
-- result = 1 2 10 4 5 6
Pořadí můžete seřadit pomocí FLOWR a 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
Položky v posloupnosti můžete spočítat pomocí funkce fn:count().
declare @x xml
set @x=''
select @x.query('count( (1,2,3,(),4) )')
go
-- result = 4
Příklad C
Následující dotaz je zadán ve sloupci AdditionalContactInfo xml typ v tabulce Kontakt. Tento sloupec obsahuje další kontaktní údaje, například jedno nebo více dalších telefonních čísel, čísel stránek a adres.
<telephoneNumber>, <pager>a další uzly se můžou objevit kdekoli v dokumentu. Dotaz vytvoří sekvenci, která obsahuje všechny <telefonní číslo> podřízených položek kontextového uzlu a potom <stránkovací> podřízené položky. Všimněte si použití operátoru sekvence čárky ve návratovém výrazu ($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
Toto je výsledek:
<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>
Filtrování sekvencí
Posloupnost vrácenou výrazem můžete filtrovat přidáním predikátu do výrazu. Další informace najdete v tématu výrazy cesty (XQuery). Následující dotaz například vrátí posloupnost tří uzlů prvků <a
>:
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a')
Toto je výsledek:
<a attrA="1">111</a>
<a />
<a />
Pokud chcete načíst pouze <a
> elementy, které mají atribut attrA, můžete v predikátu zadat filtr. Výsledná sekvence bude mít pouze jeden prvek <a
>.
declare @x xml
set @x = '<root>
<a attrA="1">111</a>
<a></a>
<a></a>
</root>'
SELECT @x.query('/root/a[@attrA]')
Toto je výsledek:
<a attrA="1">111</a>
Další informace o tom, jak určit predikáty ve výrazu cesty, naleznete v tématu Určení predikátů v kroku výrazu cesty.
Následující příklad vytvoří sekvenční výraz podstromů a pak použije filtr na sekvenci.
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>
'
Výraz v (/a, /b)
vytvoří sekvenci s podstromy /a
a /b
a z výsledné sekvence výraz filtruje prvek <c>
.
SELECT @x.query('
(/a, /b)/c
')
Toto je výsledek:
<c>C under a</c>
<c>C under b</c>
Následující příklad použije filtr predikátu. Výraz najde prvky <a
> a <b
>, které obsahují prvek <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]
')
Toto je výsledek:
<a>
<c>C under a</c>
</a>
<b>
<c>C under b</c>
</b>
Omezení implementace
Toto jsou omezení:
Výraz rozsahu XQuery není podporován.
Sekvence musí být homogenní. Konkrétně všechny položky v sekvenci musí být buď uzly, nebo atomické hodnoty. To je staticky zaškrtnuté.
Kombinování sekvencí uzlů pomocí sjednocení, protínání nebo s výjimkou operátoru není podporováno.