Publicidade

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.

Deixe um comentário

O seu endereço de e-mail não será publicado.