SQL – For XML
Olá pessoal, hoje tenho uma dica bem interessante que uso bastante no trabalho, a instrução “FOR XML”.
A instrução “FOR XML”, como o nome sugere, gera uma saída da consulta efetuada em formato XML.
Vamos supor uma consulta simples de dados de uma tabela de Usuários, como a tabela abaixo:
Tabela: Usuario Campo Tipo Nome varchar(20) Idade int Sexo char Linhas da tabela: Nome Idade Sexo Juca Pimenta 45 M Mariana Santa 18 F Mario Luigi 33 M
Se quisermos consultar todos os dados da tabela ordenando por idade, faremos um SQL simples assim:
--Consulta: SELECT * FROM Usuarios ORDER BY Nome --Resultado Nome Idade Sexo Mariana Santa 18 F Mario Luigi 33 M Juca Pimenta 45 M
Agora, se quisermos utilizar estes dados em um WebService por exemplo, precisaremos formatá-los como XML, usando a instrução “FOR XML” no final da consulta, dessa forma:
--Consulta: SELECT * FROM Usuarios ORDER BY Nome FOR XML AUTO --Resultado <Usuarios Nome="Mariana Santa" Idade=18 Sexo="F"/> <Usuarios Nome="Mario Luigi" Idade=33 Sexo="M"/> <Usuarios Nome="Juca pimenta" Idade=45 Sexo="M"/>
Reparem que após a instrução “FOR XML” eu usei o parâmetro “AUTO”, que gera a saída acima.
Caso queiramos utilizar uma estrutura XML, devemos trocar o parâmetro “AUTO” por “PATH”, que define os nós do documento, desta forma:
--Consulta:
SELECT *
FROM Usuarios
ORDER BY Nome
FOR XML PATH('Usuarios')
--Resultado
<Usuarios>
<Nome>Mariana Santa</Nome>
<Idade>18</Idade>
<Sexo>F</Sexo>
</Usuarios>
<Usuarios>
<Nome>Mario Luigi</Nome>
<Idade>33</Idade>
<Sexo>M</Sexo>
</Usuarios>
<Usuarios>
<Nome>Juca Pimenta</Nome>
<Idade>45</Idade>
<Sexo>M</Sexo>
</Usuarios>
Com o parâmetro “ROOT” associado ao parâmetro “PATH”, podemos definir o nó raiz, dessa forma:
--Consulta:
SELECT *
FROM Usuarios
ORDER BY Nome
FOR XML PATH('Usuarios'), ROOT('DADOS')
--Resultado
<DADOS>
<Usuarios>
<Nome>Mariana Santa</Nome>
<Idade>18</Idade>
<Sexo>F</Sexo>
</Usuarios>
<Usuarios>
<Nome>Mario Luigi</Nome>
<Idade>33</Idade>
<Sexo>M</Sexo>
</Usuarios>
<Usuarios>
<Nome>Juca Pimenta</Nome>
<Idade>45</Idade>
<Sexo>M</Sexo>
</Usuarios>
</DADOS>
E aqui temos um truque, se utilizarmos o parâmetro “PATH” vazio, podemos juntar todos dados, assim:
--Consulta:
SELECT *
FROM Usuarios
ORDER BY Nome
FOR XML PATH('')
--Resultado
Mariana Santa18FMario Luigi33MJuca pimenta45M
Tudo foi concatenado sem formatação, resolvemos isso dessa forma:
--Consulta:
SELECT Nome + '|' + Idade + '|' + Sexo + ';'
FROM Usuarios
ORDER BY Nome
FOR XML PATH('')
--Resultado
Mariana Santa|18|F;Mario Luigi|33|M;Juca pimenta|45|M;
Dessa forma concatenamos todos resultados em uma única linha, se for utilizado em um “JOIN”, teremos os resultados do “JOIN” como se fosse um campo da consulta principal, experimente!
Abraços.

