Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Conforme descrito em PARA XML (SQL Server), o modo AUTO retorna os resultados da consulta como elementos XML aninhados. Isso não fornece muito controle sobre a forma do XML gerado a partir de um resultado de consulta. As consultas do modo AUTO são úteis se você quiser gerar hierarquias simples. No entanto, Usar o Modo EXPLÍCITO com FOR XML e Usar o Modo PATH com FOR XML fornecem mais controle e flexibilidade na decisão da forma do XML a partir de um resultado de consulta.
Cada tabela na cláusula FROM, da qual pelo menos uma coluna é listada na cláusula SELECT, é representada como um elemento XML. As colunas listadas na cláusula SELECT são mapeadas para atributos ou subelementos, se a opção opcional ELEMENTS for especificada na cláusula FOR XML.
A hierarquia XML, aninhamento dos elementos, no XML resultante é baseada na ordem das tabelas identificadas pelas colunas especificadas na cláusula SELECT. Portanto, a ordem na qual os nomes das colunas são especificados na cláusula SELECT é significativa. A primeira tabela mais à esquerda identificada forma o elemento superior no documento XML resultante. A segunda tabela mais à esquerda, identificada por colunas na instrução SELECT, forma um subelemento dentro do elemento superior e assim por diante.
Se um nome de coluna listado na cláusula SELECT for de uma tabela já identificada por uma coluna especificada anteriormente na cláusula SELECT, a coluna será adicionada como um atributo do elemento já criado, em vez de abrir um novo nível de hierarquia. Se a opção ELEMENTS for especificada, a coluna será adicionada como um atributo.
Por exemplo, execute esta consulta:
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO;
Este é o resultado parcial:
<Cust CustomerID="1" CustomerType="S">
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="44501" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="45283" Status="5" />
<OrderHeader CustomerID="1" SalesOrderID="46042" Status="5" />
</Cust>
...
Observe o seguinte na cláusula SELECT:
O CustomerID refere-se à tabela Cust. Portanto, um elemento
<Cust>é criado e CustomerID é adicionado como seu atributo.Em seguida, três colunas, OrderHeader.CustomerID, OrderHeader.SaleOrderID e OrderHeader.Status, fazem referência à tabela OrderHeader. Portanto, um elemento
<OrderHeader>é adicionado como um subelemento do elemento<Cust>e as três colunas são adicionadas como atributos de<OrderHeader>.Em seguida, a coluna Cust.CustomerType novamente faz referência à tabela Cust que já foi identificada pela coluna Cust.CustomerID. Portanto, nenhum novo elemento é criado. Em vez disso, o atributo CustomerType é adicionado ao elemento
<Cust>que foi criado anteriormente.A consulta especifica aliases para os nomes das tabelas. Esses aliases aparecem como nomes de elementos correspondentes.
ORDER BY é obrigatório para agrupar todos os filhos sob um pai.
Esta consulta é semelhante à anterior, exceto que a cláusula SELECT especifica colunas na tabela OrderHeader antes das colunas na tabela Cust. Portanto, primeiro <OrderHeader> elemento é criado e, em seguida, o elemento filho <Cust> é adicionado a ele.
select OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerID,
Cust.CustomerType
from Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
where Cust.CustomerID = OrderHeader.CustomerID
for xml auto;
Este é o resultado parcial:
<OrderHeader CustomerID="1" SalesOrderID="43860" Status="5">
<Cust CustomerID="1" CustomerType="S" />
</OrderHeader>
...
Se a opção ELEMENTS for adicionada na cláusula FOR XML, o XML centrado em elementos será retornado.
SELECT Cust.CustomerID,
OrderHeader.CustomerID,
OrderHeader.SalesOrderID,
OrderHeader.Status,
Cust.CustomerType
FROM Sales.Customer Cust, Sales.SalesOrderHeader OrderHeader
WHERE Cust.CustomerID = OrderHeader.CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS
Este é o resultado parcial:
<Cust>
<CustomerID>1</CustomerID>
<CustomerType>S</CustomerType>
<OrderHeader>
<CustomerID>1</CustomerID>
<SalesOrderID>43860</SalesOrderID>
<Status>5</Status>
</OrderHeader>
...
</Cust>
...
Nesta consulta, os valores de CustomerID são comparados de uma linha para outra na criação dos elementos <Cust>, porque CustomerID é a chave primária da tabela. Se CustomerID não for identificado como a chave primária da tabela, todos os valores de coluna (CustomerID, CustomerType nesta consulta) serão comparados de uma linha para outra. Se os valores diferirem, um novo elemento <Cust> será adicionado ao XML.
Ao comparar esses valores de coluna, se qualquer uma das colunas a serem comparadas for do tipo texto, ntext, imagemou xml , FOR XML assume que os valores são diferentes e não comparados, mesmo que possam ser os mesmos. Isso ocorre porque a comparação de objetos grandes não é suportada. Os elementos são adicionados ao resultado para cada linha selecionada. As colunas de (n)varchar(max) e varbinary(max) são comparadas.
Quando uma coluna na cláusula SELECT não pode ser associada a nenhuma das tabelas identificadas na cláusula FROM, como no caso de uma coluna agregada ou coluna computada, a coluna é adicionada no documento XML no nível de aninhamento mais profundo no local quando é encontrada na lista. Se essa coluna aparecer como a primeira coluna na cláusula SELECT, a coluna será adicionada ao elemento superior.
Se o caractere curinga asterisco (*) for especificado na cláusula SELECT, o aninhamento será determinado da mesma forma anteriormente descrita, com base na ordem em que o mecanismo de consulta devolve as linhas.
Próximos passos
Os seguintes artigos fornecem mais informações sobre o modo AUTO: