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;
以上です。