【问题标题】:SCD type 2 using SQL Server MERGE, how to capture counts?SCD 类型 2 使用 SQL Server MERGE,如何捕获计数?
【发布时间】:2015-04-13 18:08:05
【问题描述】:

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 ;

【问题讨论】:

    标签: sql-server merge ssis-2012


    【解决方案1】:

    很遗憾,MERGE 命令本身不提供捕获 ACTION 计数的方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多