FOR XML (SQL Server)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
Uma consulta SELECT
retorna resultados como um conjunto de linhas. Opcionalmente, é possível recuperar resultados formais de uma consulta SQL como XML especificando a cláusula FOR XML
na consulta. A cláusula FOR XML
pode ser usada em consultas de nível superior e em subconsultas. A cláusula FOR XML
de nível superior só pode ser usada na instrução SELECT
. Em subconsultas, FOR XML
pode ser usada nas instruções INSERT
, UPDATE
e DELETE
. FOR XML
também pode ser usada em instruções de atribuição.
Em uma cláusula FOR XML
, você pode especificar um destes modos:
RAW
AUTO
EXPLICIT
PATH
O modo RAW
gera um elemento <row>
único por linha no conjunto de linhas retornado pela instrução SELECT
. É possível gerar hierarquia XML escrevendo consultas FOR XML
aninhadas.
O modo AUTO
gera aninhamento no XML resultante usando heurística com base na maneira como a instrução SELECT
é especificada. Você tem controle mínimo sobre a forma do XML gerado. As consultas FOR XML
aninhadas podem ser escritas para gerar hierarquia XML além da forma do XML gerada pela heurística do modo AUTO
.
O modo EXPLICIT
permite mais controle sobre a forma do XML. É possível misturar atributos e elementos à vontade para decidir a forma do XML. Um formato específico é necessário para o conjunto de linhas resultante que é gerado por causa da execução da consulta. Em seguida, esse formato do conjunto de linhas é mapeado na forma do XML. A força do modo EXPLICIT
é misturar atributos e elementos à vontade, criar wrappers e propriedades aninhadas complexas, criar valores separados por espaços (por exemplo, o atributo OrderID
pode ter uma lista de valores de ID do pedido) e conteúdo misto.
No entanto, escrever consultas no modo EXPLICIT
pode ser trabalhoso. É possível usar algumas das novas capacidades de FOR XML
, como escrever consultas no modo FOR XML RAW
aninhadas, AUTO
ou PATH
e a diretiva TYPE
em vez de usar o modo EXPLICIT
para gerar as hierarquias. As consultas FOR XML
aninhadas podem produzir qualquer XML que possa ser gerado usando o modo EXPLICIT
. Para obter mais informações, consulte Usar consultas FOR XML aninhadas e Diretiva TYPE em consultas FOR XML.
O modo PATH
, com a capacidade de consulta FOR XML
aninhada fornece a flexibilidade do modo EXPLICIT
de uma maneira mais simples.
Esses modos estão em vigor apenas para a execução da consulta para a qual eles estão definidos. Eles não afetam os resultados de qualquer consulta subsequente.
FOR XML
não é válido para seleções usadas com uma cláusula FOR BROWSE
.
Exemplos
A instrução SELECT
a seguir recupera informações das tabelas Sales.Customer
e Sales.SalesOrderHeader
o banco de dados AdventureWorks2022
. Essa consulta especifica o modo AUTO
na cláusula FOR XML
:
USE AdventureWorks2022;
GO
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.STATUS
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader OrderHeader
ON Cust.CustomerID = OrderHeader.CustomerID
FOR XML AUTO;
A cláusula FOR XML e nomes de servidores
Quando uma instrução SELECT
com uma cláusula FOR XML
especifica um nome de quatro partes na consulta, o nome do servidor não é retornado no documento XML resultante quando a consulta é executada no computador local. No entanto o nome do servidor é retornado como o nome de quatro partes quando a consulta é executada em um servidor de rede.
Por exemplo, considere esta consulta:
SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person
FOR XML AUTO;
Servidor local: quando ServerName
é um servidor local, a consulta retorna o seguinte texto:
<AdventureWorks2022.Person.Person LastName="Achong" />
Servidor de rede: quando ServerName
é um servidor de rede, a consulta retorna o seguinte texto:
<ServerName.AdventureWorks2022.Person.Person LastName="Achong" />
Evitar ambiguidade: essa possível ambiguidade pode ser evitada com a especificação desse alias:
SELECT TOP 1 LastName
FROM ServerName.AdventureWorks2022.Person.Person x
FOR XML AUTO;
Agora, a consulta não ambígua retorna o seguinte texto:
<x LastName="Achong"/>