|

Como Obter o Resultado de uma Consulta em XML e o seu Schema no SQL Server

Compartilhe :

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.

Posts Similares