我在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>
我需要在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
的sql查询。
我测试了这个查询:
WorkflowXML.exist
但RoleNames
不正确,并返回xml列中的所有require_once _PS_MODULE_DIR_ . 'rootpay/override/Rootpay/Client/Service/EcomCheckoutFormServiceClient.php';
。
如果有人可以解释这个问题的解决方案,那将非常有用。
感谢。
答案 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'