2016-08-13 9 views
2

でダイナミックな親とXMLの子ノードの値を取得します。私はこのようなSQL Serverで<code>Process</code>テーブルを持つSQL Serverの

enter image description here

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> 

私が必要idノードにincomingの値がoutgoingの値と等しくなるようにするSQLクエリ。bpmn:startEventノード。

私はこのサブクエリをテスト:

;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 

誰かがこの問題の解決策を説明することができればそれは非常に参考になります。

ありがとうございました。

+0

上記のサンプルデータで予想される出力はどのくらいですか? – har07

+0

@ har07サンプルデータの場合、結果はid = "ServiceTask_17e1u09"、id = "UserTask_038517r" –

答えて

3

あなたは任意の名前の要素を参照するために*を使用することができます。cross applybpmn:process要素レベルの子でXMLデータを細断処理す​​るために使用される

;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 

ていることに注意してください。これにより、問合せは単一のXML列データから複数の行を戻すことができます。

関連する問題