Como Obter o Resultado de uma Consulta em XML e o seu Schema no SQL Server
Em alguns cenários, principalmente na integração com outros sistemas, é útil que o próprio SQL Server devolva o resultado de uma consulta já em formato XML, em vez de no formato tabular tradicional. O SQL Server resolve isso com a cláusula FOR XML, disponível desde a versão 2000 e ampliada nas versões seguintes.
Neste post você vai ver a forma recomendada de gerar XML com schema nas versões atuais do SQL Server e a forma antiga, usada em versões mais antigas.
Os exemplos abaixo usam o banco de exemplo Northwind. Se você está em uma instância recente do SQL Server, repare que o Northwind não vem mais instalado por padrão desde a versão 2005; é preciso baixar e restaurar o script de exemplo separadamente a partir do repositório oficial da Microsoft. Nas instâncias mais novas, também é comum usar o AdventureWorks ou o WideWorldImporters como bancos de exemplo.
Forma recomendada (SQL Server 2005 em diante): FOR XML AUTO, XMLSCHEMA
A opção XMLDATA, usada no SQL Server 2000, foi descontinuada a partir do SQL Server 2005 e substituída por XMLSCHEMA, que gera um schema XSD mais completo e compatível com os padrões atuais de XML:
SELECT * FROM Orders
FOR XML AUTO, XMLSCHEMA;
O resultado traz o schema (XSD) da estrutura retornada, seguido pelos dados já formatados em XML, de forma parecida com o que XMLDATA fazia, mas em um formato de schema mais moderno e mais próximo do padrão W3C.
Também é possível nomear o schema gerado, o que ajuda quando o XML resultante vai ser consumido por outro sistema:
SELECT * FROM Orders
FOR XML AUTO, XMLSCHEMA('NorthwindOrdersSchema');
Os diferentes modos do FOR XML
Além de AUTO, o FOR XML aceita outros modos, cada um controlando de forma diferente como o XML é estruturado:
| Modo | O que faz |
|---|---|
RAW |
Gera um elemento <row> por linha, com as colunas como atributos. Estrutura simples, sem hierarquia |
AUTO |
Gera a estrutura de elementos automaticamente, com base nas tabelas e colunas da consulta |
EXPLICIT |
Permite controlar manualmente, coluna por coluna, a estrutura do XML gerado. Mais flexível, porém mais complexo de escrever |
PATH |
Permite definir a estrutura do XML por meio de aliases nas colunas, oferecendo controle fino com uma sintaxe mais simples que EXPLICIT
|
Um exemplo simples com RAW:
SELECT OrderID, CustomerID, OrderDate
FROM Orders
FOR XML RAW;
E um exemplo com PATH, que costuma ser a opção mais usada hoje quando se precisa de controle sobre a estrutura do XML, sem a complexidade do EXPLICIT:
SELECT
OrderID AS '@Id',
CustomerID AS 'Cliente',
OrderDate AS 'Data'
FROM Orders
FOR XML PATH('Pedido'), ROOT('Pedidos');
Forma antiga (SQL Server 2000): FOR XML AUTO, XMLDATA
Em versões muito antigas, como o SQL Server 2000, a forma de obter o schema junto com os dados era usando XMLDATA:
SELECT * FROM Orders
FOR XML AUTO, XMLDATA;
Essa opção ainda funciona por compatibilidade em algumas versões, mas está oficialmente descontinuada. Se você está criando uma consulta nova, prefira XMLSCHEMA no lugar de XMLDATA.
Conclusão
Para gerar XML a partir de uma consulta no SQL Server, FOR XML AUTO continua sendo o ponto de partida mais simples. Se você também precisa do schema junto com os dados, use XMLSCHEMA em vez do antigo XMLDATA. E se precisar de controle mais fino sobre a estrutura do XML gerado, vale conhecer FOR XML PATH, que hoje é a opção mais flexível sem cair na complexidade do EXPLICIT.