Тип SCD 2, включая Счетчик версий каждый раз, когда изменяется запись - PullRequest
0 голосов
/ 07 января 2019

Я хочу счетчик +1 для моего медленно меняющегося измерения DIM_Object. Каждый раз, когда изменяется запись из таблицы PMEObject, я хочу, чтобы DIM_Object.Versie увеличивался на 1.

Все в коде работает нормально, его также можно запустить без ошибок. Однако там, где у меня «+1 Верси», мне нужно, чтобы он действительно сосчитал и сослался на прошлую строку, где он показывает фактическое число, к которому нужно добавить +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 Верси», я хочу, чтобы он действительно накапливался на основе предыдущего числа DIM_Object.Versie. Прямо сейчас он просто останется «1», так как я думаю, что он видит только NULL в текущей записи.

У вас есть идеи?

С уважением,

Ad

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Значения, которые обновляются в 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';
0 голосов
/ 07 января 2019

Может ли эта модификация работать на вас? Я добавил подзапрос к вашему [Вставить значения ...]

Create Table #DIM_Object
(
ObjectId Int,
[Name] NVarChar(25),
End_Date Date,
Eff_Date Date,
Current_Flag Char(1),
Versie Int
)
Insert Into #DIM_Object Values
(1,'Me','2019-01-06','2020-12-31','y',1)


Create Table #PMEObject
(
ObjectId Int,
[Name] NVarChar(25),
End_Date Date,
Eff_Date Date,
Current_Flag Char(1),
Versie Int
)
Insert Into #PMEObject Values
(2,'You','2019-01-30','2019-01-07','n',1),
(1,'Him','2019-01-06','2020-12-31','n',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'
               , (Select Versie From #PMEObject p Where p.ObjectId = CS.ObjectId ) + 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';

Результат:

ObjectId    Name    End_Date    Eff_Date    Current_Flag    Versie
1           Me      2019-01-05  2020-12-31      n           1
2           You     2019-01-06  2199-12-31      y           2
1           Him     2019-01-06  2199-12-31      y           1
...