sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu dotazovat hodnotu ve sloupci SQL Server XML

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

V případě, že váš sloupec není XML , musíte jej převést. K dotazování na určité atributy vašich dat XML můžete také použít jinou syntaxi. Zde je příklad...

Předpokládejme, že datový sloupec má toto:

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

... a chcete pouze ty, kde CodeSystem = 2 pak váš dotaz bude:

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

Tyto stránky vám ukážou více o tom, jak dotazovat XML v T-SQL:

Dotazování na pole XML pomocí t-sql

Sloučení dat XML v SQL Server

UPRAVIT

Poté, co jsem si s tím trochu pohrál, skončil jsem s tímto úžasným dotazem, který používá CROSS APPLY. Tento bude hledat v každém řádku (roli) hodnotu, kterou zadáte do vašeho podobného výrazu...

Vzhledem k této struktuře tabulky:

create table MyTable (Roles XML)

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

Můžeme se na to zeptat takto:

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

SQL Fiddle můžete zkontrolovat zde:http://sqlfiddle.com/#!18/dc4d2/1/0



  1. Podmíněná vložka MySQL

  2. Automatické mazání zapomenutých transakcí v MS SQL Server

  3. JDBC vrací výjimku MySQLSyntaxError se správným příkazem

  4. Automatizace tabulkového modelu zpracování databází Analysis Services (SSAS) na serveru SQL Server