获取XML子节点的属性值与父节点

时间:2016-07-19 08:26:17

标签: sql sql-server xml

我在sql server数据库中有一个Process表,如下所示:

Proccess Table

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>

我需要在RoleName Task type Taskstart节点中获取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 的sql查询。 我测试了这个查询:

WorkflowXML.exist

RoleNames不正确,并返回xml列中的所有require_once _PS_MODULE_DIR_ . 'rootpay/override/Rootpay/Client/Service/EcomCheckoutFormServiceClient.php';

如果有人可以解释这个问题的解决方案,那将非常有用。

感谢。

2 个答案:

答案 0 :(得分:3)

将过滤器直接包含在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的方法可能会因更大的金额/结构而变得非常缓慢......

答案 1 :(得分:1)

您可以将WHERE语句更改为:

WHERE m.c.value('../../@type','varchar(max)') = 'start'