Udostępnij za pośrednictwem


Wyrażenie sekwencji (XQuery)

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

Dla węzła * predykat ma wartość true, jeśli nie ma żadnych węzłów, a wartość FALSE dla sekwencję puste.

Numeryczny typ, taki jak dwukrotnie i typ float generuje błąd w pisowni statyczne.

Sekwencja może zawierać duplikaty wartości.Sekwencje zagnieżdżone, czyli sekwencje w sekwencji, są zwijane.Na przykład sekwencja (1, 2, (3, 4, (5))) staje się sekwencją (1, 2, 3, 4, 5).Przykłady konstruowania sekwencji są podane poniżej.

Dlatego wartość predykatu prawdziwość to wyrażenie ma wartość true tylko dla węzłów, którego położenie kontekstu jest 3.

Trzeci krok określa również symbol wieloznaczny ** wskazującą, że wszystkie węzły w test węzła.

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

Predykat filtruje węzłów i zwraca tylko węzeł na trzecim miejscu.

-- 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ż jest konstruowana sekwencja wartości rozproszonych i węzłów.Taka sekwencja nie jest obsługiwana, jako heterogeniczna.

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

Przykład B

Kwerenda pobiera tych klientów, którzy mają dzieci.

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

Wyrażenie w dla pętli składa się z dwóch kroków, a drugi krok określa predykatu.

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

Ten predykat wartość wartość typu logiczny.

W następującym przykładzie kwerenda jest określana na kolumnie AdditionalContactInfo typu xml w tabeli Contact.W tej kolumnie są przechowywane dodatkowe informacje kontaktowe, jak jeden lub więcej dodatkowych numerów telefonu, numerów pagera i adresów.Węzły <telephoneNumber>, <pager> i inne mogą pojawić się wszędzie w dokumencie.Kwerenda konstruuje sekwencję, która zawiera wszystkie obiekty podrzędne węzła kontekstu <telephoneNumber>, po których następują obiekty podrzędne węzła <pager>.Należy zwrócić uwagę na przecinek, który jest operatorem sekwencji 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.Contact
WHERE ContactID=3

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

Wpisywanie statycznych i filtry predykatu

Zwróconą sekwencję można filtrować według wyrażeń, dodając do wyrażenia predykat.Aby uzyskać więcej informacji, zobacz Wyrażenie ścieżka (XQuery).Na przykład następująca kwerenda zwraca sekwencję trzech węzłów elementu <a>:

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

To jest wynik:

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

To retrieve only <a> elements that have the attribute attrA, you can specify a filter in the predicate.The resulting sequence will have only one <a> element.

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

To jest wynik:

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

For more information about how to specify predicates in a path expression, see Określanie predykatów na etapie wyrażenie ścieżka.

W następującym przykładzie zostanie zbudowane wyrażenie sekwencji z drzewami podrzędnymi, a następnie na sekwencję zostanie nałożony filtr.

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

The expression in (/a, /b) constructs a sequence with subtrees /a and /b and from the resulting sequence the expression filters element <c>.

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

To jest wynik:

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

urządzenie źródłowe ciąg znaków.The expression finds elements <a> and <b> that contain 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]
')

To jest wynik:

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

defaultButton

Ograniczenia są następujące:

  • Jeśli wartość ta jest ujemna lub 0, zwracane są tylko te znaki w pozycjach większą niż zero.

  • Sekwencje muszą być homogeniczne.Konkretnie, każdy element sekwencji musi być albo węzłem, albo wartością rozproszoną.Jest to sprawdzane statycznie.

  • Łączenie sekwencji węzłów przy użyciu operatorów koniunkcji, alternatywy lub zaprzeczenia nie jest obsługiwane.

See Also

Concepts