Partilhar via


Utilizar consultas FOR XML aninhadas

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

O tipo de dados xml e a diretiva TYPE em consultas FOR XML permite 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 variável de tipo de xml ou usar XQuery para consultar o resultado e atribuir esse resultado a uma variável de tipo de xml 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, é possível processar o XML retornado na variável, @x, usando um dos métodos xml tipo de dados. Por exemplo, você pode recuperar o valor do atributo ProductModelID 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 consulta FOR XML é retornado como um tipo de xml, porque a diretiva TYPE é especificada na cláusula FOR XML.

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 tipo de xml, pode especificar diretamente um dos métodos do tipo de dados xml neste XML, conforme mostrado na consulta a seguir. Na consulta, o método query() (xml Data Type) é usado para recuperar o primeiro elemento <row> filho do elemento <myRoot>.

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

Retornar resultados de consulta interna FOR XML para consultas externas como instâncias de tipo xml

Você pode escrever consultas FOR XML aninhadas, em que o resultado da consulta interna é retornado como um 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 da consulta anterior:

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

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

Controlar a forma dos dados XML resultantes

As 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 atributos e parcialmente centrado em elementos.

Para obter mais informações sobre como especificar XML centrado em atributos e em elementos com consultas FOR XML aninhadas, consulte FOR XML Query Comparado a Consulta FOR XML Aninhada e Criar XML com Consultas FOR XML Aninhadas.

Você pode gerar hierarquias XML que incluem irmãos especificando o modo AUTO aninhado para consultas XML. Para obter mais informações, consulte Gerar irmãos com uma consulta de modo AUTO aninhado.

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.