Ir para o conteúdo

Como consultar valores em XML com T-SQL e XPath

O XML tem ultimamente vindo a ganhar muita utilidade no que toca a armazenamento de dados por várias razões, uma delas é por ser muito dinâmico. Este artigo mostra diferentes maneiras de trabalhar com XML.

Para efectuar consultas, vou recorrer as capacidades do XPath.

Nos exemplos que se seguem o XML é preenchido manualmente apenas para mostrar o seu funcionamento, na sua implementação poderá vir de um campo do tipo XML que esteja guardado na BD.

Exemplo 1

DECLARE @X XML 
SET @X = '
<Registo>
    <Coluna Nome="Coluna1">
        <Valor>123</Valor>
    </Coluna>
</Registo>
'

SELECT @X.value('(Registo/Coluna/@Nome)[1]', 'VarChar (Max)') AS Nome,
@X.value('(Registo/Coluna/Valor)[1]', 'VarChar (Max)') AS Valor

Neste exemplo temos o XML muito simples, apenas com três níveis.

Basicamente o que se tem de fazer é isto, caso o valor seja declarado dentro da tag, deverá ser colocado o @ antes do nome, caso esteja num nível inferior já não.

Também é necessário indicar o tipo de dados de destino, neste caso utilizei o VarChar para ambos.

Exemplo 2

DECLARE @X XML 
SET @X = '
<Registo>
    <Coluna Nome="Coluna1">
        <Valor>123</Valor>
        <Valor>12345</Valor>
    </Coluna>
</Registo>
'

SELECT @X.value('(Registo/Coluna/@Nome)[1]', 'VarChar (Max)') AS Nome,
@X.value('(Registo/Coluna/Valor)[1]', 'VarChar (Max)') AS Valor,
@X.value('(Registo/Coluna/Valor)[2]', 'VarChar (Max)') AS Valor2

Neste caso a única difrença relativamente ao exemplo anterior é que este tem duas tags Valor. O [1] representa a primeira e o [2] representa a segunda.

Exemplo 3

DECLARE @X XML 
SET @X = '
<Registo>
    <Coluna Nome="Coluna1">
        <Valor>123</Valor>
    </Coluna>
    <Coluna Nome="Coluna2">
        <Valor>456</Valor>
    </Coluna>
</Registo>
'

SELECT Registo.value('@Nome[1]', 'VarChar (100)') AS Nome,
Registo.value('Valor[1]', 'VarChar (100)') AS Valor
FROM @X.nodes('Registo/Coluna') Registo([Registo])

Este exemplo mostra como percorrer mais do que uma coluna, para isso foi necessário colocar esses valores numa variável chamada Registo.