mssqlサーバーに2つのテーブルがあります。カスタムの挿入/更新/削除およびMergeステートメントを介してscdを実行できます。
目的を達成できる一般的な手順があることを知りたいです。2つのテーブルを渡すだけで、SCDを形成するはずです。SQL Server 2008のオプションはありますか?ありがとう
いいえ、どのテーブルに渡しても適切な汎用的なものはありません。いくつかの理由で:
それが不可能な理由ではありませんが、次のことも考慮してください。UPSERT
通常、一時テーブルで機能する適切なテーブルのMERGE
場合、特別な場合を除いて、ステートメントはSCDに適していません。MERGE
これは、ステートメントをanと一緒に使用することはできず、そのためにINSERT/UPDATE
外部キーを無効にする必要があるためUPDATE
ですDELETE THEN INSERT
。 。
私はそれをこのようにすることを好みます(SCDタイプ2とSQL Server):
ステップ1:
IF EXISTS (
SELECT * FROM sys.objects
WHERE name = 'tmpDimSource')
DROP TABLE tmpDimSource;
SELECT
*
INTO tmpDimSource
FROM
(
SELECT whatever
FROM yourTable
);
ステップ2:
IF EXISTS (
SELECT * FROM sys.objects
WHERE name = 'tmpDimYourDimensionName')
DROP TABLE tmpDimYourDimensionName;
SELECT * INTO tmpDimYourDimensionName FROM D_yourDimensionName WHERE 1 = 0;
INSERT INTO tmpDimYourDimensionName
(
sid, /*a surrogate id column*/
theColumnsYouNeedInYourDimension,
validFrom
)
SELECT
ISNULL(d.sid, 0),
ds.theColumnsYouNeedInYourDimension,
DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) /*the current date*/
FROM
tmpDimSource ds
LEFT JOIN D_yourDimensionName d ON ds.whateverId = c.whateverId
;
ISNULL(d.sid, 0)
ステップ2で重要です。エントリがすでに存在する場合はディメンションの代理IDを返し、存在しない場合は0を返します。
ステップ3:
UPDATE D_yourDimensionName SET
validTo = DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 1, 0) /*yesterday*/
FROM
D_yourDimensionName d
INNER JOIN tmpDimYourDimensionName t ON d.sid = t.sid
WHERE t.sid <> 0 AND
(
d.theColumnWhichHasChangedAndIsImportant <> t.theColumnWhichHasChangedAndIsImportant OR
d.anotherColumn <> t.anotherColumn
)
;
ステップ3では、既存のエントリを無効としてマークし、その履歴を保持します。で取得する有効なエントリWHERE validTo IS NULL
。
必要に応じて、別の列を追加UPDATE
して、他の列を新しい値で上書きすることもできます。
ステップ4:
INSERT INTO D_yourDimensionName
SELECT * FROM tmpDimYourDimensionName
WHERE sid = 0;
以上です。