Compartilhar via


Usar o modo AUTO com FOR XML

Conforme descrito em FOR 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 de modo AUTO serão úteis se você quiser gerar hierarquias simples. No entanto, usar o modo EXPLICIT com FOR XML e usar o modo PATH com FOR XML fornece mais controle e flexibilidade para decidir a forma do XML de um resultado de consulta.

Cada tabela na cláusula FROM, da qual pelo menos uma coluna está listada na cláusula SELECT, é representada como um elemento XML. As colunas listadas na cláusula SELECT serão mapeadas para atributos ou subelementos, se a opção ELEMENTS opcional 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 de coluna 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 faz referência à tabela Cust. Portanto, um <Cust> elemento é 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 <OrderHeader> elemento é adicionado como um subelemento do>Cust< elemento e as três colunas são adicionadas como atributos de .<OrderHeader>

  • Em seguida, a coluna Cust.CustomerType referencia novamente a tabela Cust que já foi identificada pela coluna Cust.CustomerID. Portanto, nenhum novo elemento é criado. Em vez disso, o atributo CustomerType é adicionado ao <Cust> elemento que foi criado anteriormente.

  • A consulta especifica aliases para os nomes de tabela. Esses aliases aparecem como nomes de elementos correspondentes.

  • ORDER BY é necessário para agrupar todos os filhos sob um único pai.

Essa consulta é semelhante à anterior, exceto que a cláusula SELECT especifica colunas na tabela OrderHeader antes das colunas na tabela Cust. Portanto, o primeiro <OrderHeader> elemento é criado e, em seguida, o <Cust> elemento filho é 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 à cláusula FOR XML, XML centrado em elemento 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 CustomerID são comparados de uma linha à outra na criação dos <elementos Cust> , pois 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 a outra. Se os valores forem diferentes, 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, imagem ou xml, o FOR XML pressupõe que os valores são diferentes e não comparados, mesmo que sejam iguais. Isso ocorre porque não há suporte para a comparação de objetos grandes. Os elementos são adicionados ao resultado de cada linha selecionada. Observe que 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 de agregação ou coluna computada, a coluna é adicionada no documento XML no nível de aninhamento mais profundo em vigor 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 maneira descrita anteriormente, com base na ordem em que as linhas são retornadas pelo mecanismo de consulta.

Nesta seção

Os tópicos a seguir fornecem mais informações sobre o modo AUTO:

Consulte Também

SELECT (Transact-SQL)
FOR XML (SQL Server)