我有存储过程阶段信息的过程阶段表。每个流程阶段都可以有一条或多条通往下一阶段的路线,并且此信息与每个阶段一起存储在 xml 列中。
例如阶段样本数据
stageId | stageXML
A | '<stage id="A"><routes><route id="1"><action><method>goToStage</method><arguments><id>B</id></arguments></action></route><route id="2"><action><method>goToStage</method><arguments><id>C</id></arguments></action></route><route id="3"><action><method>goToStage</method><arguments><id>D</id></arguments></action></route></routes></stage>'
B | '<stage id="B"><routes><route id="1"><action><method>goToStage</method><arguments><id>END</id></arguments></action></route></routes></stage>'
C | '<stage id="C"><routes><route id="1"><action><method>goToStage</method><arguments><id>A</id></arguments></action></route></routes></stage>'
D | '<stage id="D"><routes><route id="1"><action><method>goToStage</method><arguments><id/></arguments></action></route></routes></stage>'
SQL 创建测试数据:
CREATE TABLE #stages
(stageId CHAR(1), stageXML xml)
INSERT INTO
#stages(stageId,stageXML)
VALUES
('A' , '<stage id="A"><routes><route id="1"><action><method>goToStage</method><arguments><id>B</id></arguments></action></route><route id="2"><action><method>goToStage</method><arguments><id>C</id></arguments></action></route><route id="3"><action><method>goToStage</method><arguments><id>D</id></arguments></action></route></routes></stage>'),
('B' , '<stage id="B"><routes><route id="1"><action><method>goToStage</method><arguments><id>END</id></arguments></action></route></routes></stage>'),
('C' , '<stage id="C"><routes><route id="1"><action><method>goToStage</method><arguments><id>A</id></arguments></action></route></routes></stage>'),
('D' , '<stage id="D"><routes><route id="1"><action><method>goToStage</method><arguments><id/></arguments></action></route></routes></stage>')
SELECT * from #stages
每个阶段都遵循 goToStage 方法到下一个阶段,直到它达到“END”的 goToStage/id,或者没有下一个阶段(没有 goToStage/id)或者下一个阶段已经通过。
所以我需要做的是使用 SQL Server 2008+ 得到以下结果: 注意,路由列可以是逗号分隔的,也可以是 xml 或任何可用的。
stageId | route
A | B, END
A | C, A, END
A | D, END
我确信这是可以做到的,但我正在努力让 SQL 正确,所以任何帮助都会很棒。
提前致谢。
更新: 经过一番修改,我设法将路线数据提取为以下格式:
stageId | nextStageId
A | B
A | C
A | D
B | END
C | A
D |
使用 SQL,如果更容易的话,也许有人可以帮助我创建路由。
SELECT t.c.value('@id', 'VARCHAR(3)') AS stageId,
t1.c1.value('.', 'VARCHAR(3)') AS nextStageId
FROM #stages
CROSS APPLY stageXML.nodes('//stage') as T(C)
CROSS APPLY stageXML.nodes('//route/action/arguments/id') as T1(C1)
WHERE stageXml.exist('//method[text()="goToStage"]') = 1