SCD类型2使用SQL Server MERGE,如何捕获计数?

时间:2015-02-12 20:23:40

标签: sql-server merge ssis-2012

SQL Server和MERGE的新手。

我正在使用MERGE语句来填充缓慢变化的维度表。我的示例包括类型1和类型2属性。我看到了如何使用OUTPUT捕获操作计数的示例,我了解如何使用OUTPUT将值传递给INSERT语句。我想做的是采用以下代码,以某种方式捕获UPDATE和INSERT操作的计数,以便进行审计/记录。

关于OUTPUT和OUTPUT INTO的阅读文章非常混乱,但据我所知,我不认为我可以做我想做的事,至少不使用OUTPUT。

有没有办法从下面的语句中捕获ACTION计数?有没有更好的方法来实现这一目标?

谢谢

BEGIN

 MERGE dbo.dimTable tgt
 USING dbo.stgTable src
     ON tgt.NaturalKey = src.NaturalKey
     AND tgt.IsActiveRow = 'Y'
 WHEN MATCHED
     AND EXISTS 
     (SELECT src.SCD1Field
         EXCEPT 
      SELECT tgt.SCD1Field
         )
    THEN
         UPDATE SET
             tgt.SCD1Field = src.SCD1Field ;

 INSERT dbo.dimTable (
       tgt.NaturalKey
     , tgt.SCD1Field
     , tgt.SCD2Field    
     , tgt.RowStartDate
     , tgt.RowEndDate
     , tgt.IsActiveRow
     )
SELECT
     NaturalKey
     , SCD1Field
     , SCD2Field
     , RowStartDate
     , RowEndDate
     , IsActiveRow
 FROM (
     MERGE dbo.dimTable tgt
     USING dbo.stgTable src
         ON tgt.NaturalKey = src.NaturalKey
     WHEN NOT MATCHED BY TARGET
     THEN
         INSERT (
         NaturalKey
         , SCD1Field
         , SCD2Field
         , RowStartDate
         , RowEndDate
         , IsActiveRow
         )
         VALUES (
         src.NaturalKey
         , src.SCD1Field
         , src.SCD2Field
         , GETDATE()
         , NULL
         , 'Y'
         )
     WHEN MATCHED
         AND tgt.IsActiveRow = 'Y'
         AND EXISTS 
            (
         SELECT src.SCD2Field
         EXCEPT 
         SELECT tgt.SCD2Field
             )
             THEN
                 UPDATE
                 SET IsActiveRow = 'N'
                     , RowEndDate = DATEADD(dd,-1,GETDATE())
     OUTPUT $ACTION Action_Out
         , src.NaturalKey
         , src.SCD1Field
         , src.SCD2Field
         , GETDATE() RowStartDate
         , NULL RowEndDate
         , 'Y' IsActiveRow
     )m
 WHERE m.Action_Out = 'UPDATE'
 END ;

1 个答案:

答案 0 :(得分:0)

不幸的是,MERGE命令本身并没有提供捕获ACTION计数的方法。

然而,您可以做的是添加另一个步骤来计算您正在记录它们的表中的ACTION结果,假设您有某种审计键或日期列可用于将结果与最近的执行。