Compartilhar via


Usar consultas FOR XML aninhadas

O xml tipo de dados e a diretiva TYPE em consultas FOR XML permitem que o XML retornado pelas consultas FOR XML seja processado no servidor, bem como no cliente.

Processamento com variáveis de tipo xml

Você pode atribuir o resultado da consulta FOR XML a uma xml variável de tipo ou usar XQuery para consultar o resultado e atribuir esse resultado a uma xml variável de tipo para mais processamento.

DECLARE @x xml  
SET @x=(SELECT ProductModelID, Name  
        FROM Production.ProductModel  
        WHERE ProductModelID=122 or ProductModelID=119  
        FOR XML RAW, TYPE)  
SELECT @x  
-- Result  
--<row ProductModelID="122" Name="All-Purpose Bike Stand" />  
--<row ProductModelID="119" Name="Bike Wash" />  

Além disso, você pode processar o XML retornado na variável, @x, usando um dos métodos de tipos de dados xml. Por exemplo, você pode recuperar o valor do ProductModelID atributo usando o método value().

DECLARE @i int;  
SET @i = (SELECT @x.value('/row[1]/@ProductModelID[1]', 'int'));  
SELECT @i;  

No exemplo a seguir, o resultado da FOR XML consulta é retornado como um xml tipo, pois a TYPE diretiva é especificada na FOR XML cláusula.

SELECT ProductModelID, Name  
FROM Production.ProductModel  
WHERE ProductModelID=119 or ProductModelID=122  
FOR XML RAW, TYPE,ROOT('myRoot');  
  

Este é o resultado:

<myRoot>  
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />  
  <row ProductModelID="119" Name="Bike Wash" />  
</myRoot>  

Como o resultado é do xml tipo, você pode especificar um dos métodos de tipo de xml dados diretamente em relação a esse XML, conforme mostrado na consulta a seguir. Na consulta, o método query() (tipo de dados xml) é usado para recuperar o primeiro <row> filho do <myRoot> elemento.

SELECT  (SELECT ProductModelID, Name  
         FROM Production.ProductModel  
         WHERE ProductModelID=119 or ProductModelID=122  
         FOR XML RAW, TYPE,ROOT('myRoot')).query('/myRoot[1]/row[1]');  
  

Este é o resultado:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />  

Retornando resultados internos da consulta FOR XML para consultas externas como instâncias de tipo xml

Você pode escrever consultas aninhadas FOR XML, onde o resultado da consulta interna é retornado como tipo xml para a consulta externa. Por exemplo:

SELECT Col1,   
       Col2,   
       ( SELECT Col3, Col4   
        FROM  T2  
        WHERE T2.Col = T1.Col  
        ...  
        FOR XML AUTO, TYPE )  
FROM T1  
WHERE ...  
FOR XML AUTO, TYPE;  

Observe o seguinte na consulta anterior:

  • O XML gerado pela consulta interna FOR XML é adicionado ao XML gerado pelo exterior FOR XML.

  • A consulta interna especifica a TYPE diretiva. Portanto, os dados XML retornados pela consulta interna são do xml tipo. Se a diretiva TYPE não for especificada, o resultado da consulta interna FOR XML será retornado como nvarchar(max) e os dados XML serão entitizados.

Controlando a forma de dados XML resultantes

Consultas FOR XML aninhadas oferecem mais controle na definição da forma dos dados XML resultantes. Você pode usar consultas FOR XML aninhadas para construir XML que é parcialmente centrado em atributo e parcialmente centrado em elementos.

Para obter mais informações sobre como especificar XML centrado em atributos e elementos com consultas FOR XML aninhadas, consulte Comparação entre FOR XML e FOR XML Aninhada e Modelar XML com Consultas FOR XML Aninhadas.

Você pode gerar hierarquias XML que incluem elementos irmãos ao especificar consultas FOR XML em modo AUTO aninhado. Para obter mais informações, consulte Gerar irmãos com uma consulta aninhada do Modo AUTO.

Independentemente do modo usado, as consultas FOR XML aninhadas fornecem mais controle na descrição da forma do XML resultante. Eles podem ser usados no lugar de consultas no modo EXPLICIT.

Exemplos

Os tópicos a seguir fornecem exemplos de consultas FOR XML aninhadas.

Consulta FOR XML comparada à consulta FOR XML aninhada
Compara uma consulta FOR XML de nível único a uma consulta FOR XML aninhada. Este exemplo inclui uma demonstração de como especificar XML centrado em atributo e centrado em elemento como resultado da consulta.

Gerar irmãos com uma consulta aninhada do modo AUTO
Mostra como gerar irmãos usando uma consulta aninhada do modo AUTO

Utilize consultas FOR XML aninhadas no ASP.NET
Demonstra como um aplicativo ASPX pode usar FOR XML para retornar XML do SQL Server.

Formate XML com consultas FOR XML aninhadas
Mostra como usar consultas FOR XML aninhadas para controlar a estrutura de um documento XML criado pelo SQL Server.