Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann ich einen Wert in der SQL Server-XML-Spalte abfragen

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

Falls Ihre Spalte nicht XML ist , müssen Sie es konvertieren. Sie können auch andere Syntax verwenden, um bestimmte Attribute Ihrer XML-Daten abzufragen. Hier ist ein Beispiel...

Nehmen wir an, diese Datenspalte hat Folgendes:

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

... und Sie wollen nur die mit CodeSystem = 2 dann lautet Ihre Abfrage:

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

Diese Seiten zeigen Ihnen mehr darüber, wie Sie XML in T-SQL abfragen:

Abfragen von XML-Feldern mit t-sql

Reduzieren von XML-Daten in SQL Server

BEARBEITEN

Nachdem ich ein bisschen mehr damit herumgespielt hatte, landete ich bei dieser erstaunlichen Abfrage, die CROSS APPLY verwendet. Dieser durchsucht jede Zeile (Rolle) nach dem Wert, den Sie in Ihren Like-Ausdruck eingegeben haben ...

Angesichts dieser Tabellenstruktur:

create table MyTable (Roles XML)

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

Wir können es so abfragen:

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

Sie können die SQL-Fiddle hier überprüfen:http://sqlfiddle.com/#!18/dc4d2/1/0