Usando XML – A Cláusula FOR XML - Parte 1

 

Neste artigo é o primeiro de uma série em que iniciaremos uma exploração dos recursos do Extensible Markup Language (XML) no SQL Server 2005, descrevendo o conhecimento e as habilidades para trabalhar com XML através do uso da cláusula FOR XML, da função OPENXML e o novo tipo de dado nativo xml.

O uso do XML é um requisito comum de muitas aplicações hoje em dia. Muitas vezes uma aplicação precisa transformar dados XML para o formato relacional, ou então armazenar e manipular dados XML de forma nativa em um banco de dados relacional.

Usando a cláusula FOR XML

A cláusula FOR XML é usada para retornar dados do banco de dados em um formato XML. Esta cláusula instrui o query engine do SQL Server a retornar os dados como um stream XML ao invés de um rowset. Os desenvolvedores podem construir aplicações que extraem documentos XML, como pedidos ou catálogo de produtos, diretamente do banco de dados. Descreveremos aqui o uso da cláusula FOR XML e as várias opções disponíveis para configurar o formato do XML retornado pela consulta.

Você pode controlar o formato do XML especificando um dos quatro modos: RAW, AUTO, EXPLICIT ou PATH. Em conjunto, você pode especificar várias outras opções para controlar o retorno da consulta. A cláusula FOR XML é adicionada à declaração SELECT como mostra a sintaxe abaixo:

 

FOR XML

{

{ RAW [ ( 'ElementName' ) ] | AUTO }

[

<CommonDirectives>

[ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]

[ , ELEMENTS [ XSINIL | ABSENT ]

]

| EXPLICIT

[

<CommonDirectives>

[ , XMLDATA ]

]

| PATH [ ( 'ElementName' ) ]

[

<CommonDirectives>

[ , ELEMENTS [ XSINIL | ABSENT ] ]

]

}

<CommonDirectives> ::=

[ , BINARY BASE64 ]

[ , TYPE ]

[ , ROOT [ ( 'RootName' ) ] ]

 

Os modos e as opções mais comumente usadas com FOR XML estão descritos na tabela abaixo:

 

Modo/opção

Descrição

Modo RAW

Transforma cada linha do resultado da consulta em um elemento que tem um identificador de linha genérico <row> como tag de elemento.

Modo AUTO

Retorna o resultado da consulta em uma estrutura XML de árvore simples e aninhada. Cada tabela da cláusula FROM que tem pelo menos uma coluna na lista do SELECT é representado como um elemento XML. As colunas listadas na cláusula SELECT são mapeadas para atributos de elementos apropriados.

Modo EXPLICIT

É uma opção de formato customizado que podemos usar quando os modos RAW e AUTO são insuficientes.

Modo PATH

Provê uma maneira simples de intercalar elementos e atributos, e controlar a representação de propriedades complexas.

Opção ELEMENTS

Retorna as colunas como subelementos ao invés de atributos para os modos RAW, AUTO e PATH.

Opção ROOT

Adiciona um elemento de nível superior ao resultado XML. Se você precisa retornar um documento XML bem formado com um simples elemento raiz, você deve especificar esta opção. Pode-se especificar também um nome para este elemento raiz.

Opção TYPE

Retorna o resultado da consulta como um tipo de dados xml.

Opção XMLDATA

Retorna um esquema XDR.

Opção XMLSHEMA

Retorna um esquema XSD.

O que é o modo de consulta RAW

Usamos o modo RAW para retornar uma representação XML de um rowset. As aplicações podem processar o XML no formato genérico ou então aplicar uma folha de estilos XSLT para transformar o XML em um formato de documento específico ou numa representação de interface para o usuário. Considere os seguintes recursos do modo RAW:

F    Um elemento representa cada linha do resultado retornado pela consulta.

F    Um atributo com mesmo nome do nome da coluna ou alias usado na consulta representa cada coluna do resultado, a menos que a opção ELEMENTS é especificada, e neste caso cada coluna é mapeada para um subelemento do elemento de linha.

F    O modo de consulta RAW pode incluir colunas agregadas e cláusulas GROUP BY.  

As consultas a seguir foram executadas no banco de dados AdventureWorks, que vem junto com a instalação do SQL Server 2005. O exemplo abaixo mostra como você pode retornar um fragmento XML contendo dados de pedido com o uso de uma consulta FOR XML no modo RAW.

 

SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID

FROM Sales.Customer Cust JOIN Sales.SalesOrderHeader [Order]

ON Cust.CustomerID = [Order].CustomerID

ORDER BY Cust.CustomerID

FOR XML RAW

 

Esta consulta produz um fragmento XML no formato que contém elementos genéricos <row>, como mostra o exemplo abaixo.

 

<row CustID="1" CustomerType="S" SalesOrderID="43860"/>

<row CustID="1" CustomerType="S" SalesOrderID="44501"/>

 

Note que a coluna CustomerID usa o alias CustID, o qual determina o nome do atributo.

O próximo exemplo mostra como você pode retornar os mesmos dados como elementos ao invés de atributos, especificando a opção ELEMENTS.

 

SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID

FROM Sales.Customer Cust JOIN Sales.SalesOrderHeader [Order]

ON Cust.CustomerID = [Order].CustomerID

ORDER BY Cust.CustomerID

FOR XML RAW, ELEMENTS

 

Esta consulta retorna um fragmento XML no formato mostrado pelo exemplo abaixo.

 

<row>

<CustID>1</CustID>

<CustomerType>S</CustomerType>

<SalesOrderID>43860</SalesOrderID>

</row>

<row>

<CustID>1</CustID>

<CustomerType>S</CustomerType>

<SalesOrderID>44501</SalesOrderID>

</row>

 

O exemplo abaixo mostra como você pode retornar os mesmos dados usando um elemento root especificado com a opção ROOT, e alterar o nome do elemento <row> usando o argumento opcional do modo RAW.

 

SELECT Cust.CustomerID CustID, CustomerType, SalesOrderID

FROM Sales.Customer Cust JOIN Sales.SalesOrderHeader [Order]

ON Cust.CustomerID = [Order].CustomerID

ORDER BY Cust.CustomerID

FOR XML RAW('Order'), ROOT('Orders')

 

Esta consulta produz um documento XML bem formado no formato mostrado pelo exemplo abaixo.

 

<Orders>

<Order CustID="1" CustomerType="S" SalesOrderID="43860"/>

<Order CustID="1" CustomerType="S" SalesOrderID="44501"/>

</Orders>

 

Note que se a opção ELEMENTS fosse também especificada, o resultado retornado conteria elementos ao invés de atributos.

Conclusões

Documentos XML são cruciais para muitas aplicações de negócio, e o SQL Server não deve apenas ser capaz de armazenar documentos XML, mas ser uma plataforma que permita o retorno e a integração de dados XML com dados relacionais. Neste artigo fizemos uma breve introdução à cláusula FOR XML e ao modo de retorno RAW, permitindo o retorno das consultas em fragmentos XML. No próximo artigo continuaremos nossa exploração com os outros modos AUTO, EXPLICIT e PATH. Um grande abraço e até lá.