Share via


Expressões de seqüência (XQuery)

O SQL Server oferece suporte aos operadores XQuery usados para construir, filtrar e combinar uma seqüência de itens. Um item pode ser um valor atômico ou um nó.

Construindo seqüências

Você pode usar o operador vírgula para construir uma seqüência que concatena itens em uma única seqüência.

Uma seqüência pode conter valores duplicados. As seqüências aninhadas, uma seqüência dentro de uma seqüência, são recolhidas. Por exemplo, a seqüência (1, 2, (3, 4, (5))) se torna (1, 2, 3, 4, 5). Estes são exemplos de construção de seqüências.

Exemplo A

A consulta a seguir retorna uma seqüência de cinco valores atômicos:

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

A consulta a seguir retorna uma seqüência de dois nós:

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

A consulta a seguir retorna um erro, pois você está construindo uma seqüência de valores atômicos e nós. Esta é uma seqüência heterogênea e sem suporte.

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

Exemplo B

A consulta a seguir constrói uma seqüência de valores atômicos combinando quatro seqüências de comprimento diferente em uma única seqüência.

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

Você pode classificar a seqüência usando FLOWR e 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

Você pode contar os itens na seqüência usando a função fn:count().

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

Exemplo C

A consulta a seguir é especificada na coluna AdditionalContactInfo do tipo xml na tabela Contact. Essa coluna armazena informações adicionais do contato, como um ou mais números de telefone, números de pager e endereços. <telephoneNumber>, <pager>e outros nós podem aparecer em qualquer lugar no documento. A consulta constrói uma seqüência que contém todos os filhos de <telephoneNumber> do nó de contexto, seguido pelos filhos de <pager>. Observe o uso do operador de seqüência vírgula na expressão de retorno, ($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

Este é o resultado:

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

Filtrando seqüências

Você pode filtrar a seqüência retornada por uma expressão adicionando um predicado à expressão. Para obter mais informações, consulte Expressões de caminho (XQuery). Por exemplo, a consulta a seguir retorna uma seqüência de três nós do elemento <a>:

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

Este é o resultado:

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

Para recuperar apenas os elementos <a> que têm o atributo attrA, especifique um filtro no predicado. A seqüência resultante terá só um elemento <a>.

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

Este é o resultado:

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

Para obter mais informações sobre como especificar predicados em uma expressão de caminho, consulte Especificando predicados em uma etapa de expressão de caminho.

O exemplo a seguir constrói uma expressão de seqüência de subárvores e depois aplica um filtro à seqüência.

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

A expressão em (/a, /b) constrói uma seqüência com subárvores /a e /b e da seqüência resultante a expressão filtra o elemento <c>.

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

Este é o resultado:

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

O exemplo a seguir aplica um filtro de predicado. A expressão localiza os elementos <a> e <b> que contêm o elemento <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]
')

Este é o resultado:

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

Limitações de implementação

Estas são as limitações:

  • Não há suporte para a expressão de intervalo XQuery.

  • As seqüências devem ser homogêneas. Especificamente, todos os itens em uma seqüência devem ser nós ou valores atômicos. Isso é verificado estaticamente.

  • Não há suporte para a combinação de seqüências de nó usando operadores de união, intersecção ou exceção.

Consulte também

Conceitos