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.