簡體   English   中英

在SQL Server中使用動態父項獲取XML子節點值

[英]Get XML child node value with dynamic parent in SQL Server

我在SQL Server中有一個Process表,如下所示:

在此處輸入圖片說明

workflowXML列具有以下值:

<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" 
      xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" 
      xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" 
      xmlns:di="http://www.omg.org/spec/DD/20100524/DI" 
      id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
     <bpmn:process id="Process_1" isExecutable="false">
         <bpmn:startEvent id="StartEvent_1rin5au">
             <bpmn:outgoing>SequenceFlow_1q36672</bpmn:outgoing>
         </bpmn:startEvent>   
         <bpmn:userTask id="UserTask_038517r" name="addRequest">
             <bpmn:incoming>SequenceFlow_1q36672</bpmn:incoming>
             <bpmn:outgoing>SequenceFlow_0dpq0oe</bpmn:outgoing>
         </bpmn:userTask>      
         <bpmn:serviceTask id="ServiceTask_17e1u09" name="checkRequest">
             <bpmn:incoming>SequenceFlow_1q36672</bpmn:incoming>
             <bpmn:outgoing>SequenceFlow_1233bp0</bpmn:outgoing>
         </bpmn:serviceTask>        
     </bpmn:process>    
</bpmn:definitions>

我需要一個SQL查詢來獲取id節點,該id節點的incoming值與bpmn:startEvent節點中的outgoing值相等。

我測試這個子查詢:

;WITH XMLNAMESPACES('http://www.omg.org/spec/BPMN/20100524/MODEL' AS bpmn) 
select 
    p.workflowXML.value('(bpmn:definitions/bpmn:process/bpmn:userTask/bpmn:incoming)[1]', 'nvarchar(max)')
from 
    Process as p    

但是此代碼僅返回bpmn:userTask結果。 我使用了其他子查詢:

;WITH XMLNAMESPACES('http://www.omg.org/spec/BPMN/20100524/MODEL' AS bpmn) 
select 
    p.workflowXML.value('(bpmn:definitions/bpmn:process/../bpmn:incoming)[1]', 'nvarchar(max)')
from 
    Process as p

但是它返回null

我的查詢是這樣的:

declare @SequenceFlow nvarchar(max)
;WITH XMLNAMESPACES('http://www.omg.org/spec/BPMN/20100524/MODEL' AS bpmn) 
select @SequenceFlow = 
(
SELECT p.workflowXML.value('(/bpmn:definitions/bpmn:process/bpmn:startEvent/bpmn:outgoing)[1]','nvarchar(max)') 
from Process as p
where ID = 1
)

;WITH XMLNAMESPACES('http://www.omg.org/spec/BPMN/20100524/MODEL' AS bpmn) 
select p.workflowXML.value('(bpmn:definitions/bpmn:process/../bpmn:incoming)[1]','nvarchar(max)')
from Process as p
where p.workflowXML.value('(bpmn:definitions/bpmn:process/../bpmn:incoming)[1]','nvarchar(max)') = @SequenceFlow

如果有人可以解釋該問題的解決方案,這將非常有幫助。

謝謝。

您可以使用*引用任意名稱的元素:

;WITH XMLNAMESPACES('http://www.omg.org/spec/BPMN/20100524/MODEL' AS bpmn) 
select t.c.value('@id','nvarchar(max)')
from Process as p
    cross apply p.DiagramXML.nodes('bpmn:definitions/bpmn:process/*') AS t(c)
where t.c.value('bpmn:incoming[1]', 'nvarchar(max)') = @SequenceFlow

注意, cross apply用於在bpmn:process元素級別的子級切碎XML數據。 這允許查詢從單個XML列數據返回多行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM