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