Warm tip: This article is reproduced from serverfault.com, please click

其他-如何在SQL Server XML列中查询值

(其他 - How can I query a value in SQL Server XML column)

发布于 2012-04-27 04:02:04

我将以下XML存储在RolesSQL Server数据库的XML列(称为)中。

<root>
   <role>Alpha</role>
   <role>Beta</role>
   <role>Gamma</role>
</root>

我想列出所有在其中具有特定角色的行。该角色由参数传递。

Questioner
Bistro
Viewed
0
Leniel Maccaferri 2020-11-14 00:55:37
select
  Roles
from
  MyTable
where
  Roles.value('(/root/role)[1]', 'varchar(max)') like 'StringToSearchFor'

如果你的列不是XML,则需要对其进行转换。你还可以使用其他语法查询XML数据的某些属性。这是一个例子...

让我们假设数据列具有以下内容:

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

...,而你只想CodeSystem = 2查询的地方是:

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

这些页面将向你展示有关如何在T-SQL中查询XML的更多信息:

使用T-SQL查询XML字段

在SQL Server中展平XML数据

编辑

在玩了一点之后,我最终得到了一个使用CROSS APPLY的惊人查询这将在每一行(角色)中搜索你喜欢的表达式中输入的值...

给定此表结构:

create table MyTable (Roles XML)

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

我们可以这样查询它:

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