Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come posso interrogare un valore nella colonna XML di SQL Server

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

Nel caso in cui la tua colonna non sia XML , devi convertirlo. Puoi anche utilizzare un'altra sintassi per interrogare determinati attributi dei tuoi dati XML. Ecco un esempio...

Supponiamo che la colonna di dati abbia questo:

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

... e vuoi solo quelli dove CodeSystem = 2 quindi la tua domanda sarà:

select 
  [data] 
from
  [dbo].[CodeSystemCodes_data]
  
where
  CAST([data] as XML).value('(/Utilities.CodeSystems.CodeSystemCodes/@CodeSystem)[1]', 'varchar(max)') = '2'

Queste pagine ti mostreranno di più su come eseguire query XML in T-SQL:

Interrogazione di campi XML utilizzando t-sql

Conversione dei dati XML in SQL Server

MODIFICA

Dopo averci giocato un po' di più, mi sono ritrovato con questa stupefacente query che utilizza CROSS APPLY. Questo cercherà in ogni riga (ruolo) il valore che hai inserito nella tua espressione simile...

Data questa struttura di tabella:

create table MyTable (Roles XML)

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

Possiamo interrogarlo in questo modo:

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

Puoi controllare SQL Fiddle qui:http://sqlfiddle.com/#!18/dc4d2/1/0