1

次の (長い) SQL ステートメントを使用して、タイプ 2 ディメンションを変更しています。

INSERT INTO AtlasDataWarehouseReports.District
(
    Col01,
    Col02,
    Col03,
    Col04,
    Col05,
    Col06,
    Col07,
    Col08,
    Col09,
    Col10,
    StartDateTime,
    EndDateTime
)
SELECT
    Col01,
    Col02,
    Col03,
    Col04,
    Col05,
    Col06,
    Col07,
    Col08,
    Col09,
    Col10,
    CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)) AS StartDateTime,
    NULL AS EndDateTime
FROM 
(
    MERGE AtlasDataWarehouseReports.District AS MergeTarget

    USING Staging.District as MergeSource
        ON MergeTarget.Col01 = MergeSource.Col01
        AND MergeTarget.EndDateTime IS NULL

    WHEN MATCHED 
        AND (
                MergeTarget.Col02 <> MergeSource.Col02
                OR MergeTarget.Col05 <> MergeSource.Col05
            )
    THEN
        UPDATE SET MergeTarget.EndDateTime = CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101))

    WHEN NOT MATCHED 
    THEN
        INSERT 
        (
            Col01,
            Col02,
            Col03,
            Col04,
            Col05,
            Col06,
            Col07,
            Col08,
            Col09,
            Col10,
            StartDateTime,
            EndDateTime
        )
        VALUES 
        (
            MergeSource.Col01,
            MergeSource.Col02,
            MergeSource.Col03,
            MergeSource.Col04,
            MergeSource.Col05,
            MergeSource.Col06,
            MergeSource.Col07,
            MergeSource.Col08,
            MergeSource.Col09,
            MergeSource.Col10,
            CONVERT (DATETIME, CONVERT (Varchar, GetDate(), 101)),
            NULL
        )
    OUTPUT $Action as MergeAction, MergeSource.*
) AS MergeOutput
WHERE 1=1
    AND MergeOutput.MergeAction = 'UPDATE';

これを、データ ウェアハウスをロードする ETL の一部として実行しています。組み込みたいのは、ログ テーブル/ファイルなどのすべての変更を追跡できる詳細なログ システムです。

MERGE と INSERT で使用される OUTPUT の間に実際に行われるすべての作業は、舞台裏で行われます。このクエリに参加したすべての列と値を追跡したいと考えています。

このデータを取得する方法はありますか?

4

1 に答える 1

1

ここで T-SQL MERGE ステートメントを使用することの欠点は、実際に何が起こっているのかがわかりにくくなるため、ログを導入するには重複した作業が必要になる可能性があることです。

私の考えですが、ここで車輪を少し再発明しているようです。

SQL Server Integration Services (SSIS) は、これらの正確な処理要件に対応する事前構築済みのコンポーネントを提供します。

たとえば、既存の緩やかに変化するディメンション変換コンポーネントを使用するか、いくつかの下位レベルのコンポーネントを使用して独自のカスタム ソリューションを実装し、後でログを組み込むことができます。

于 2009-07-29T06:29:23.857 に答える