Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como posso consultar um valor na coluna XML do SQL Server

select
  Roles
from
  MyTable
where
  Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'

Caso sua coluna não seja XML , você precisa convertê-lo. Você também pode usar outra sintaxe para consultar determinados atributos de seus dados XML. Aqui está um exemplo...

Vamos supor que a coluna de dados tenha isso:
<Utilities.CodeSystems.CodeSystemCodes iid="107" CodeSystem="2" Code="0001F" CodeTags="-19-"..../>

... e você só quer aqueles em que CodeSystem = 2 então sua consulta será:
select 
  [data] 
from
  [dbo].[CodeSystemCodes_data]
  
where
  CAST([data] as XML).value('(/Utilities.CodeSystems.CodeSystemCodes/@CodeSystem)[1]', 'varchar(max)') = '2'

Estas páginas mostrarão mais sobre como consultar XML em T-SQL:

Consultando campos XML usando t-sql

Achatando dados XML no SQL Server

EDITAR

Depois de brincar um pouco mais, acabei com essa consulta incrível que usa CROSS APPLY. Este irá procurar em cada linha (função) o valor que você colocou na sua expressão like...

Dada esta estrutura de tabela:
create table MyTable (Roles XML)

insert into MyTable values
('<root>
   <role>Alpha</role>
   <role>Gamma</role>
   <role>Beta</role>
</root>')

Podemos consultar assim:
select * from 

(select 
       pref.value('(text())[1]', 'varchar(32)') as RoleName
from 
       MyTable CROSS APPLY

       Roles.nodes('/root/role') AS Roles(pref)
)  as Result

where RoleName like '%ga%'

Você pode verificar o SQL Fiddle aqui:http://sqlfiddle.com/#!18/dc4d2/1/0