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.