1

ゆっくりと変化するディメンション DIM_Object の +1 カウンターが必要です。テーブル PMEObject テーブルのレコードが変更されるたびに、DIM_Object.Versie を 1 ずつ増やします。

コードに関するすべてが正常に動作し、これもエラーなしで実行できます。ただし、「+1 Versie」がある場合は、実際にカウントして、+1 を追加する必要がある実際の数を示す過去の行を参照する必要があります。古いレコードを正しく参照する方法がわかりません。

INSERT  INTO DIM_Object
    SELECT  ObjectId 
            , Name 
            , Eff_Date 
            , End_Date 
            , Current_Flag
            , Versie
    FROM    ( MERGE DIM_Object CM
                USING PMEOBJECT CS
                    ON ( CM.ObjectId = CS.ObjectId )
                        WHEN NOT MATCHED 
                            THEN
    INSERT VALUES
            ( CS.ObjectId 
            , CS.Name 
            , CONVERT(CHAR(10), GETDATE() - 1, 101) 
            , '12/31/2199' 
            , 'y'
            , '1'
            )
                WHEN MATCHED AND CM.Current_Flag = 'y'
                    AND ( CM.Name <> CS.Name )
                        THEN
     UPDATE SET
            CM.Current_Flag = 'n' ,
            CM.End_date = CONVERT(CHAR(10), GETDATE() - 2, 101)
                OUTPUT
                    $Action Action_Out 
                    , CS.ObjectId 
                    , CS.Name 
                    , CONVERT(CHAR(10), GETDATE() - 1, 101) Eff_Date 
                    , '12/31/2199' End_Date 
                    , 'y' Current_Flag 
                    , +1 Versie) AS MERGE_OUT
    WHERE   MERGE_OUT.Action_Out = 'UPDATE';

「+1 Versie」を配置した場所に、DIM_Object.Versie の以前の数に基づいて実際に累積させたいと考えています。現在のレコードには NULL のみが表示されると思われるため、現在は「1」のままです。

あなたはなにか考えはありますか?

敬具、

広告

4

2 に答える 2

0

MERGE で更新された値は「削除済み」として返され、出力でそれらをキャプチャできます。OUTPUT 句 (Transact-SQL)

INSERT  INTO DIM_Object
SELECT  ObjectId 
        , Name 
        , Eff_Date 
        , End_Date 
        , Current_Flag
        , Versie
FROM    ( 
MERGE DIM_Object CM
USING PMEOBJECT CS
ON ( CM.ObjectId = CS.ObjectId )
WHEN NOT MATCHED THEN
    INSERT VALUES
            ( CS.ObjectId 
            , CS.Name 
            , CONVERT(CHAR(10), GETDATE() - 1, 101) 
            , '12/31/2199' 
            , 'y'
            , '1'
            )
WHEN MATCHED AND CM.Current_Flag = 'y' AND ( CM.Name <> CS.Name ) THEN
    UPDATE SET
        CM.Current_Flag = 'n' ,
        CM.End_date = CONVERT(CHAR(10), GETDATE() - 2, 101)
OUTPUT
    $Action Action_Out 
    , CS.ObjectId 
    , CS.Name 
    , CONVERT(CHAR(10), GETDATE() - 1, 101) Eff_Date 
    , '12/31/2199' End_Date 
    , 'y' Current_Flag 
    , deleted.Versie + 1 /* capture the modified row data */
    ) AS MERGE_OUT
WHERE   MERGE_OUT.Action_Out = 'UPDATE';
于 2019-01-07T20:30:17.547 に答える