[英]get attribute value of XML child node with where condition on parent node
我在sql server数据库中有一个Process
表,如下所示:
workflowXML列具有以下值:
<Tasks>
<Task type="start" id="Task_038517r">
<TaskUsers>
<TaskUser RoleName="User"/>
</TaskUsers>
</Task>
<Task type="final" id="Task_1sytah6">
<TaskUsers>
<TaskUser RoleName="Admin"/>
</TaskUsers>
</Task>
</Tasks>
我需要SQL进行查询得到RoleName
在Task
节点那个type
的Task
是start
。 我测试此查询:
select m.c.value('@RoleName','varchar(max)') as RoleName
from Process as p
outer apply
p.WorkflowXML.nodes('/Tasks/Task/TaskUsers/TaskUser') as m(c)
where
WorkflowXML.exist('/Tasks/Task[@type="start"]') = 1
但是WorkflowXML.exist
不正确,并且在xml列中返回所有RoleNames
。
如果有人可以解释该问题的解决方案,这将非常有帮助。
谢谢。
最好将过滤器直接包含在XPath
:
select m.c.value('@RoleName','varchar(max)') as RoleName
from Process as p
outer apply p.WorkflowXML.nodes('/Tasks/Task[@type="start"]/TaskUsers/TaskUser') as m(c)
使用较大数量/结构的WHERE
方法可能会变得很慢...
您可以将WHERE
语句更改为此:
WHERE m.c.value('../../@type','varchar(max)') = 'start'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.