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
.