首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL Server中获取具有动态父节点的XML子节点值

在SQL Server中获取具有动态父节点的XML子节点值
EN

Stack Overflow用户
提问于 2016-08-13 21:43:28
回答 1查看 1K关注 0票数 2

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

workflowXML列的值如下所示:

代码语言:javascript
复制
<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节点,它的incoming值等于bpmn:startEvent节点中的outgoing值。

我测试这个子查询:

代码语言:javascript
复制
;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的结果。我使用了其他子查询:

代码语言:javascript
复制
;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

我的查询是这样的:

代码语言:javascript
复制
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

如果有人能解释一下这个问题的解决方案,那将是非常有帮助的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-13 22:10:05

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

代码语言:javascript
复制
;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列数据返回多行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38933344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档