繁体   English   中英

使用父节点上的where条件获取XML子节点的属性值

[英]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进行查询得到RoleNameTask节点那个typeTaskstart 我测试此查询:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM