select
Roles
from
MyTable
where
Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'
Als uw kolom niet XML
is , je moet het converteren. U kunt ook een andere syntaxis gebruiken om bepaalde kenmerken van uw XML-gegevens op te vragen. Hier is een voorbeeld...
Laten we aannemen dat de gegevenskolom dit heeft:
<Utilities.CodeSystems.CodeSystemCodes iid="107" CodeSystem="2" Code="0001F" CodeTags="-19-"..../>
... en je wilt alleen degene waar CodeSystem = 2
dan is uw vraag:
select
[data]
from
[dbo].[CodeSystemCodes_data]
where
CAST([data] as XML).value('(/Utilities.CodeSystems.CodeSystemCodes/@CodeSystem)[1]', 'varchar(max)') = '2'
Op deze pagina's vindt u meer informatie over het opvragen van XML in T-SQL:
XML-velden opvragen met t-sql
XML-gegevens afvlakken in SQL Server
BEWERKEN
Nadat ik er wat meer mee had gespeeld, kreeg ik deze geweldige query die CROSS APPLY gebruikt. Deze zoekt in elke rij (rol) naar de waarde die je in je like-expressie hebt ingevoerd...
Gezien deze tabelstructuur:
create table MyTable (Roles XML)
insert into MyTable values
('<root>
<role>Alpha</role>
<role>Gamma</role>
<role>Beta</role>
</root>')
We kunnen het als volgt opvragen:
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%'
U kunt de SQL Fiddle hier controleren:http://sqlfiddle.com/#!18/dc4d2/1/0