1

我有存储过程阶段信息的过程阶段表。每个流程阶段都可以有一条或多条通往下一阶段的路线,并且此信息与每个阶段一起存储在 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
4

1 回答 1

0

数据中有循环,这在一般情况下是一个计算上难以解决的问题。例如,路线C,A,B,END导致路线C,A,C,A,B,END,路线导致路线C,A,C,A,C,A,B,END等。

SQL 无法在不陷入无限循环的情况下执行此操作,因为在您的无向路由图中存在无限数量的此类字符串。(CTE 允许无限递归,但你只会让你的服务器崩溃。)

于 2012-06-29T15:07:03.293 回答