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

Hvordan kan jeg forespørge på en værdi i SQL Server XML-kolonnen

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

Hvis din kolonne ikke er XML , skal du konvertere den. Du kan også bruge anden syntaks til at forespørge om bestemte attributter for dine XML-data. Her er et eksempel...

Lad os antage, at datakolonnen har dette:

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

... og du vil kun have dem, hvor CodeSystem = 2 så vil din forespørgsel være:

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

Disse sider vil vise dig mere om, hvordan du forespørger XML i T-SQL:

Forespørgsel i XML-felter ved hjælp af t-sql

Udfladning af XML-data i SQL Server

REDIGER

Efter at have leget lidt mere med det, endte jeg med denne fantastiske forespørgsel, der bruger CROSS APPLY. Denne vil søge i hver række (rolle) efter den værdi, du sætter i dit lignende udtryk...

Givet denne tabelstruktur:

create table MyTable (Roles XML)

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

Vi kan forespørge det sådan her:

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 tjekke SQL Fiddle her:http://sqlfiddle.com/#!18/dc4d2/1/0



  1. Returner rækker, der kun indeholder ikke-alfanumeriske tegn i SQLite

  2. JSON_ARRAY_APPEND() – Tilføj værdier til et JSON-array i MySQL

  3. Tilslutning til en Oracle-database ved hjælp af SQLAlchemy

  4. Sådan opretter du forbindelse til MySQL-server efter installation af XAMPP på Mac OS