1

mssqlサーバーに2つのテーブルがあります。カスタムの挿入/更新/削除およびMergeステートメントを介してscdを実行できます。

目的を達成できる一般的な手順があることを知りたいです。2つのテーブルを渡すだけで、SCDを形成するはずです。SQL Server 2008のオプションはありますか?ありがとう

4

1 に答える 1

1

いいえ、どのテーブルに渡しても適切な汎用的なものはありません。いくつかの理由で:

  • どのSCDタイプかをどうやって知るのですか?(さて、別のパラメーターである可能性がありますが...)
  • どの列を履歴に記録し、どの列を上書きする必要があるかをどのようにして知ることができますか?
  • どの列がビジネスキー、代理キー、有効期限列などであるかをどのように判断しますか?
  • 更新ステートメントで列を指定するには、動的SQLを作成する必要があります。これは可能ですが、上記の点が関係します。

それが不可能な理由ではありませんが、次のことも考慮してください。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;

以上です。

于 2013-01-29T11:02:58.703 に答える