Utilizando exist para pesquisar em coluna XML do SQL Server


Índice

Considerando uma tabela do SQL Server com uma coluna XML que armazenará um XML na seguinte estrutura:

<Perfis>
   <Perfil>1</Perfil>
   <Perfil>2</Perfil>
</Perfis>

Para selecionar todos os registros que possuam o elemeto Perfil com o valor “2”, podemos utilizar o comando exist()

Para exemplificar, vamos criar uma tabela de testes:

CREATE TABLE dbo.ConteudoTeste  
(  
IdConteudoTeste int identity not null,  
Titulo varchar(100) not null,  
Perfis xml null  
)

E carregue essa tabela com alguns registros:

INSERT INTO ConteudoTeste (Titulo, Perfis) values ('Conteudo 1', NULL)

INSERT INTO ConteudoTeste (Titulo, Perfis) values ('Conteudo 2', '<Perfis><Perfil>1</Perfil></Perfis>')

INSERT INTO ConteudoTeste (Titulo, Perfis) values ('Conteudo 3', '<Perfis><Perfil>2</Perfil></Perfis>')

INSERT INTO ConteudoTeste (Titulo, Perfis) values ('Conteudo 4', '<Perfis><Perfil>3</Perfil></Perfis>')

INSERT INTO ConteudoTeste (Titulo, Perfis) values ('Conteudo 5', '<Perfis><Perfil>1</Perfil><Perfil>2</Perfil></Perfis>')

INSERT INTO ConteudoTeste (Titulo, Perfis) values ('Conteudo 6', '<Perfis><Perfil>1</Perfil><Perfil>2</Perfil><Perfil>3</Perfil></Perfis>')

Para pesquisar todos os registros com Perfil 2, utilize o seguinte comando:

select * from ConteudoTeste
where Perfis.exist('(//Perfis/Perfil[text() = "2"])') = 1

Se você precisar passar esse valor através de uma variável do SQL (por exemplo para ser usado em uma Stored Procedure) utilize o seguinte comando:

declare @idPerfil int
set @idPerfil = 2
select * from ConteudoTeste where Perfis.exist('(//Perfis/Perfil[text() = sql:variable("@idPerfil")])') = 1

Comentários