sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo consultar un valor en la columna XML de SQL Server?

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

En caso de que su columna no sea XML , necesitas convertirlo. También puede usar otra sintaxis para consultar ciertos atributos de sus datos XML. Aquí hay un ejemplo...

Supongamos que la columna de datos tiene esto:

<Utilities.CodeSystems.CodeSystemCodes iid="107" CodeSystem="2" Code="0001F" CodeTags="-19-"..../>

... y solo quieres aquellos donde CodeSystem = 2 entonces su 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 le mostrarán más sobre cómo consultar XML en T-SQL:

Consultando campos XML usando t-sql

Aplanamiento de datos XML en SQL Server

EDITAR

Después de jugar un poco más, terminé con esta consulta increíble que usa APLICACIÓN CRUZADA. Este buscará en cada fila (rol) el valor que puso en su expresión similar...

Dada esta estructura de tabla:

create table MyTable (Roles XML)

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

Podemos consultarlo así:

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%'

Puede consultar SQL Fiddle aquí:http://sqlfiddle.com/#!18/dc4d2/1/0