2016-07-19 194 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' 
相關問題