Usando XML – A Cláusula FOR XML e o Modo AUTO
Este artigo faz parte da série de artigos sobre a cláusula de consulta FOR XML, suportada pelo SQL Server 2005 e usada para retornar os dados do banco de dados em formato XML. No artigo anterior, introduzimos a cláusula FOR XML, vimos a estrutura sintática do comando, uma breve descrição dos diferentes modos de retorno XML (RAW, AUTO, EXPLICIT e PATH), e alguns exemplos práticos do uso do modo RAW. Neste artigo continuaremos o estudo da cláusula FOR XML, detalhando o uso do modo AUTO.
O que é o modo de consulta AUTO
O modo de consulta AUTO produz uma representação XML das entidades envolvidas na cláusula de consulta. Considere os seguintes recursos do modo AUTO:
- Cada linha retornada pela consulta é representada como um elemento XML com o mesmo nome da tabela de origem, ou o alias usado na consulta.
- Cada JOIN da consulta resulta em um elemento XML aninhado, reduzindo a duplicação de dados. A ordem do JOIN afeta a ordem dos elementos.
- Use a cláusula ORDER BY para retornar os dados na ordem hierárquica correta, garantindo assim que os elementos filhos estejam agrupados corretamente a um elemento pai.
- Cada coluna é representada por um atributo, desde que a opção ELEMENTS não seja especificada, e neste caso cada coluna é representada por um elemento filho.
- Colunas agregadas e cláusulas GROUP BY não são suportadas no modo AUTO, entretanto você usar o modo AUTO para retornar dados agregados de uma view que use a cláusula GROUP BY.
O exemplo abaixo mostra como você pode usar o modo de consulta AUTO para retornar um fragmento XML de uma lista de pedidos.
SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader [Order]
ON Cust.CustomerID = [Order].CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO
Esta consulta produz um fragmento XML no seguinte formato.
Como podemos ver, a coluna CustomerID e as tabelas Customer e SalesOrderHeader fazem uso de alias para determinar os nomes do atributo e do elemento.
O exemplo abaixo mostra como retornar os mesmos dados como elementos ao invés de atributos usando a opção ELEMENTS.
SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader [Order]
ON Cust.CustomerID = [Order].CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS
Esta consulta produz um fragmento XML no seguinte formato.
Você também pode usar a opção ROOT, como mostrado no exemplo abaixo.
SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID
FROM Sales.Customer Cust
INNER JOIN Sales.SalesOrderHeader [Order]
ON Cust.CustomerID = [Order].CustomerID
ORDER BY Cust.CustomerID
FOR XML AUTO, ELEMENTS, ROOT('Orders')
Esta consulta produz um fragmento XML no seguinte formato.
No próximo artigo veremos o modo de consulta FOR XML EXPLICIT, uma opção que dá ao desenvolvedor maior flexibilidade e controle na geração de documentos XML. Um grande abraço e até lá.