我将以下XML存储在Roles
SQL Server数据库的XML列(称为)中。
<root>
<role>Alpha</role>
<role>Beta</role>
<role>Gamma</role>
</root>
我想列出所有在其中具有特定角色的行。该角色由参数传递。
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的更多信息:
编辑
在玩了一点之后,我最终得到了一个使用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
它回答了我所有的问题,
[1]
您的回答是做什么的?很好的答案,我为此投票,但是我猜字符串应该是varchar
@Bistro询问
[1]
是一个非常好的问题。这意味着您从XML中选择了第一个角色值,这意味着这仅适用于Alpha
在示例xml中查找。如果搜索,它将找不到该行Beta
。就我而言,我必须查询具有特定属性值的节点。这个答案是导致我解决方案的原因。我只需要在属性值两边加上双引号。
如果XML具有名称空间,我们如何查询它?