Treinamento para consultas com SQL Server - Parte 8 - FOR XML

Este recurso – que existe de outras formas em diversos bancos de dados, permite que os resultados de uma consulta sejam recuperados no formato XML. Além disso, dependendo das configurações dos parâmetros, é possível fazer uma espécie de pivoteamento transformando as linhas e colunas da consulta em uma única string, usando delimitadores para colunas e linhas.

Outro aspecto importante é que, através de FOR XML, os dados podem ser transformados para que sejam compartilhados com aplicações diversas.

O ponto principal para conseguir este resultado é transformar o retorno com a função PATH() no final da instrução. Para obter o resultado desejado, basta passar uma string vazia como parâmetro.

Considere a consulta do exemplo anterior onde cada PERSON tinha um resumo com a soma das vendas dos anos 2005-2007 sendo exibidas em cada coluna. Vamos transformar esta consulta para que para cada nome seja retornada um texto onde os registros estão separados por ponto e vírgula “;” e as colunas por “|”.

A consulta, usando FOR XML fica como é demonstrado a seguir.

select concat(p.FirstName, ' ', p.LastName) as CompleteName
 ,
  (
   select concat(convert(varchar,year(soh.OrderDate)),
     '|',
     convert(varchar, sum(soh.TotalDue)),
     ';')
   from Sales.SalesOrderHeader soh
   join Sales.Customer cus on cus.CustomerID=soh.CustomerID
   join person.Person per on per.BusinessEntityID=cus.PersonID
   where per.BusinessEntityID=p.BusinessEntityID
    and soh.OrderDate between 
                     '2005-01-01 00:00:00' and '2007-12-31 23:59:59'
   group by year(soh.orderDate)
   for xml path('')
  ) as Vendas
from Person.Person p
order by CompleteName

Note que a consulta é menor que o exemplo anterior, embora o resultado basicamente o mesmo. O resultado final consiste do nome e sobrenome seguido de um texto onde cada par ano/somatória está separado pelo caractere “|” e cada registro por um ponto e vírgula.

Neste exemplo, as colunas da sub consulta são unidas também pela função CONCAT() aplicando também os separadores de registro e de colunas.

O ponto principal é a colocação da instrução FOR XML no final da consulta. O resultado da consulta está demonstrado a seguir.

Este recurso é bastante completo e cheio de detalhes. Recomendo a leitura da documentação oficial para uma melhor compreensão.