sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag fråga ett värde i SQL Server XML-kolumnen

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

Om din kolumn inte är XML , måste du konvertera den. Du kan också använda annan syntax för att fråga efter vissa attribut för dina XML-data. Här är ett exempel...

Låt oss anta att datakolumnen har detta:

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

... och du vill bara ha de där CodeSystem = 2 då blir din fråga:

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

Dessa sidor kommer att visa dig mer om hur du frågar XML i T-SQL:

Fråga i XML-fält med t-sql

Plattning av XML-data i SQL Server

REDIGERA

Efter att ha lekt med det lite mer, slutade jag med denna fantastiska fråga som använder CROSS APPLY. Den här kommer att söka på varje rad (roll) efter värdet du lägger i ditt liknande uttryck...

Med tanke på denna tabellstruktur:

create table MyTable (Roles XML)

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

Vi kan fråga det så här:

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

Du kan kontrollera SQL Fiddle här:http://sqlfiddle.com/#!18/dc4d2/1/0



  1. SQL Server - Fråga kortslutning?

  2. 2PL, rigorös vs strikt modell, finns det någon fördel?

  3. Rätt sätt att ge användare tillgång till ytterligare scheman i Oracle

  4. Django Migrations:A Primer