Partilhar via


Expressões de sequência (XQuery)

Aplica-se a:SQL Server

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

Construindo sequências

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

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

Exemplo A

A consulta a seguir retorna uma sequê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 sequê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, porque você está construindo uma sequência de valores atômicos e nós. Esta é uma sequência heterogénea e não é suportada.

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

Exemplo B

A consulta a seguir constrói uma sequência de valores atômicos combinando quatro sequências de comprimento diferente em uma única sequê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 sequê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 sequê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 de xml na tabela Contato. Esta coluna armazena informações de contato adicionais, como um ou mais números de telefone, números de pager e endereços adicionais. O <número de telefone>, <pager>e outros nós podem aparecer em qualquer lugar do documento. A consulta constrói uma sequência que contém todos os <número de telefone> filhos do nó de contexto, seguido pelo pager <> filhos. Observe o uso do operador de sequência de vírgulas 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 sequências

Você pode filtrar a sequê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 sequência de três nós de 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 <a> elementos que têm o atributo attrA, você pode especificar um filtro no predicado. A sequência resultante terá apenas 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 expressão de caminho Etapa.

O exemplo a seguir cria uma expressão de sequência de subárvores e, em seguida, aplica um filtro à sequê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 sequência com subárvores /a e /b e a partir da sequê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 predicados. A expressão localiza elementos <a> e <b> que contêm elementos <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:

  • A expressão de intervalo XQuery não é suportada.

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

  • Não há suporte para a combinação de sequências de nó usando o operador união, interseção ou exceto.

Ver também

Expressões XQuery