Partilhar via


Usar o modo AUTO com FOR XML

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase 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:

Ver também