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
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
Mariana Santa
18
F
Mario Luigi
33
M
Juca Pimenta
45
M
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
Mariana Santa
18
F
Mario Luigi
33
M
Juca Pimenta
45
M
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.

