簡體   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