Udostępnij za pośrednictwem


Sekwencja wyrażeń (XQuery)

SQL Server obsługuje operatory XQuery, które są używane do konstruowania, przesączyć i połączyć sekwencja elementów.Element może być wartość niepodzielny lub węzła.

Konstruowanie sekwencji

Można użyć przecinka operator do konstruowania sekwencja, która łączy elementy do pojedynczego sekwencji.

Sekwencja może zawierać zduplikowanych wartości.Sekwencje zagnieżdżone sekwencji 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 konstruowaniu sekwencji.

Przykład A

Następująca kwerenda zwraca sekwencji pięć wartości niepodzielny:

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

Następująca kwerenda zwraca sekwencji dwóch węzłów:

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

Następująca kwerenda zwraca błąd, ponieważ są konstruowania sekwencji niepodzielny wartości i węzłów.To jest sekwencją heterogenicznych i nie jest obsługiwane.

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

Przykład B

Następująca kwerenda konstrukcje sekwencja wartości niepodzielny łącząc sekwencji cztery różne długości do pojedynczego sekwencji.

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

Przy użyciu FLOWR i ORDER BY, można posortować sekwencji:

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

Można policzyć elementy w sekwencji za pomocą fn:count() funkcja.

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

Przykład C

Określono następujące kwerendy przeciwko kolumna AdditionalContactInfo xml Typ w tabela Kontakt.To kolumna przechowuje dodatkowe informacje kontaktowe, takie jak jeden lub więcej dodatkowe numery telefonów, numery pagerów i adresów. <TelephoneNumber>, <pager>, i inne węzły mogą występować w dowolnym miejscu dokumentu.Kwerenda konstrukcje sekwencja, która zawiera wszystkie <telephoneNumber> dzieci węzła kontekstowego następuje <pager> dzieci.Uwaga Użyj przecinka sekwencji operator w wyrażeniu zwrotu ($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.Person
WHERE BusinessEntityID=291;

Jest to wynikiem:

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

Filtrowanie sekwencji

Można filtrować sekwencji zwróconej przez wyrażenie przez dodanie do wyrażenia predykatu.Aby uzyskać więcej informacji, zobacz Ścieżka wyrażeń (XQuery).Na przykład, poniższa kwerenda zwraca sekwencji trzech <a> węzły 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 wynikiem:

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

Aby pobrać tylko <a> elementów, które mają atrybut attrA, można określić filtr w predykacie.Sekwencja wynikowy będzie mieć tylko jeden <a> elementu.

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

Jest to wynikiem:

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

Aby uzyskać więcej informacji dotyczących sposobu określania predykaty w ścieżka wyrażenia, zobacz Określanie predykaty w kroku wyrażenie ś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) konstrukcje sekwencji z poddrzew /a i /b i z sekwencji wynikowy element filtry wyrażenie <c>.

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

Jest to wynikiem:

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

Poniższy przykład stosuje filtr predykatu.Wyrażenie odnajdzie elementów <a> i <b> zawierające 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 wynikiem:

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

Ograniczenia wdrażania

Są następujące ograniczenia:

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

  • Sekwencje muszą być jednorodne.W szczególności wszystkie elementy w sekwencji muszą być węzłów lub wartości niepodzielny.Statycznie jest sprawdzany.

  • Łączenie węzłów sekwencji za pomocą Unii, przecinają lub z wyjątkiem operator nie jest obsługiwane.

Zobacz także

Koncepcje