T-Sql の Merge ステートメントを使用して、最適化された緩やかに変化するディメンションを構築しようとしています。SCD1 と SCD2 の変更、およびデータ テーブルへの通常の挿入を処理する次のコードを作成しました。データはソース テーブルから取得され、Name と Age は SCD1 列、Animal と Blood は SCD2 列です。
DECLARE @LoadingDate DATETIME
SET @LoadingDate = '2012-08-20 14:23:29.827'
--Handle SCD1 Changes
MERGE INTO Table_2 AS DIM
USING SourceTable AS SRC
ON (DIM.ID1 = SRC.ID1
AND DIM.ID2 = SRC.ID2)
WHEN MATCHED
AND (DIM.Name <> SRC.Name
OR DIM.AGE <> SRC.AGE)
THEN
UPDATE
SET DIM.Name = SRC.Name,
DIM.Age = SRC.Age;
--Handle SCD2 Changes
INSERT INTO Table_2
(ID1, ID2, --Business Key
Name, Age, --SCD1 Columns
Animal, Blood, --SCD2 Columns
DateEffective, DateExpires)
SELECT
ID1, ID2, --Business Key
Name, Age, --SCD1 Columns
Animal, Blood, --SCD2 Columns
DateEffective, DateExpires
FROM (
MERGE Table_2 AS DIM
USING SourceTable AS SRC
ON (DIM.ID1 = SRC.ID1
AND DIM.ID2 = SRC.ID2)
WHEN NOT MATCHED
THEN INSERT VALUES
(SRC.ID1, SRC.ID2,
SRC.Name, SRC.Age,
SRC.Animal, SRC.Blood,
@LoadingDate, NULL)
WHEN MATCHED
AND DIM.DateExpires IS NULL
AND (DIM.Animal != SRC.Animal
OR DIM.Blood != SRC.Blood)
THEN UPDATE SET DIM.DateExpires = @LoadingDate
OUTPUT $action Action_Out,
SRC.ID1, SRC.ID2,
SRC.Name, SRC.Age,
SRC.Animal, SRC.Blood,
@LoadingDate AS DateEffective,
NULL AS DateExpires) AS MERGE_OUT
WHERE MERGE_OUT.Action_Out = 'UPDATE';
コードは SCD1 の変更 (コードの最初の部分) で正常に動作しますが、エラー
が発生します。
ビジネス キー ID1 と ID2 が他の行と一致しない新しい行を挿入しようとすると、エラーが表示されます。 「Labus」は名前フィールドの値です。
どちらのテーブルも次の図のように設計されていますが、SourceTable にはハウスキーピング列がありません。
助けていただければ幸いです。ありがとう!