プロセスステージ情報を保存するプロセスステージのテーブルがあります。各プロセス ステージには、次のステージへの 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
各ステージは、「END」の goToStage/id に到達するか、次のステージがない (goToStage/id がない)、または次のステージが既に渡されたステージになるまで、goToStage メソッドに従って次のステージに進みます。
したがって、私がする必要があるのは、SQL Server 2008+ を使用して次の結果を得ることです:
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