Ferramentas de Usuário

Ferramentas de Site


dev_geral:bases_de_dados:sql:consultarxml

Como consultar valores em XML com T-SQL e XPath

O XML ultimamente tem vindo a ganhar muita utilidade no que toca a armazenamento de dados por varias 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 unica difrença é que em relação 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'

Autoria

Escrito por Caça

dev_geral/bases_de_dados/sql/consultarxml.txt · Última modificação em: 2018/05/14 21:37 (edição externa)