私はWarehouseStore.dws6.BeScheduleItemというテーブルを持っています。 以下は、WarehouseStore.dws6.BeScheduleItemにあるデータのスクリーンショットです。 WarehouseStore.dws6.BeScheduleItemSQL Serverの再帰的ループ
私の要件は、WarehouseStore.dws6.BeScheduleItemテーブルから欠落しているノードを見つけることです。以下の条件に基づいています。子フィールドは、NOT NULLフィールドをIcpUidたと 親が子の場合
1にISMISSING子の親を設定し、フィールドのNULL をIcpUidている場合は、すべて0
にISMISSING設定し
フィールドにはIcpUidフィールドのNULLがあり、 の親にはIcpUidフィールドのNULLがあり、親の子にはIsMissing equal 1があります。 次にch親IsMissingを1に設定します。
更新する必要がない限り、手順3を繰り返します。
私は私のSQLコードで3にステップ1を満たすことができましたが、私はこれ以上更新がないかどうかをチェックするためにforループを行う必要があるとして、4段階ではありません。 以下は、私は上記のコードからの再帰ループを構築することができますどのようなアイデアを提案してくださいすることができ、私のSQLコード
DECLARE @TEMP TABLE (
Code NVARCHAR(MAX) NOT NULL,
Name NVARCHAR(MAX) NULL,
Level INT NULL,
IsMissing BIT NULL,
ParentCode NVARCHAR(MAX) NULL,
IcpUid NVARCHAR(MAX) NULL
);
INSERT INTO @TEMP(
Code,
Name,
Level,
IsMissing ,
ParentCode ,
IcpUid
)
SELECT
Code,
Name,
Level,
IsMissing = 0,
ParentCode,
IcpUid
FROM WarehouseStore.dws6.BeScheduleItem
WHERE IsDeleted = 0
;
UPDATE P SET IsMissing = 1
FROM @TEMP C
INNER JOIN @TEMP P ON P.Code = C.ParentCode
WHERE C.IcpUid IS NOT NULL
AND P.IcpUid IS NULL
;
SELECT
P.Code,
P.Name,
P.Level,
C.IsMissing ,
C.ParentCode ,
P.IcpUid
FROM @TEMP P
INNER JOIN @TEMP C ON P.Code = C.ParentCode
WHERE C.IsMissing = 1
AND C.IcpUid IS NULL
AND P.IcpUid IS NULL
ORDER BY LEVEL
です。 ご注意:ステップ3をループする必要がある、それが現在のデータで必要とされない場合がありますが、我々だけではなく、現在のデータ