2016-07-19 36 views
2

条件我有这样的SQL Server数据库的Process表:获得属性XML子节点的值与在父节点

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> 

我需要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是不正确的,并返回所有的RoleNames在XML列。

如果有人能够解释这个问题的解决方案,这将是非常有益的。

谢谢。

回答

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方法可以得到与更大的数额相当缓慢/结构...

+0

简单而好看! :) – gofr1

1

您可以更改WHERE声明如下:

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