【问题标题】:Rowcount for T-SQL Merge statement SCD2 type?T-SQL Merge 语句 SCD2 类型的行数?
【发布时间】:2016-02-13 06:11:22
【问题描述】:

我已经为 SCD type2 编写了 t-SQL Merge 语句,它工作正常,但是我想要更新插入行数的审计信息。 这里是例:

insert into dbo.MergegeSCD2
(id, firstname, lastname, CREATE_DTTM, MODIF_DTTM, ARCHV_FLAG, EffectiveFrom, EffectiveTo,  CurrentFlag)
select 
    id, firstname, lastname, CREATE_DTTM, MODIF_DTTM, ARCHV_FLAG, EffectiveFrom, EffectiveTo,  CurrentFlag
from 
(
--DECLARE @SummaryOfChanges TABLE(Change VARCHAR(20))

MERGE dbo.MergegeSCD2 TT
using dbo.MergegeSCD1 SS
on ss.id=tt.id
WHEN NOT MATCHED THEN
              INSERT (id, firstname, lastname, CREATE_DTTM, MODIF_DTTM, ARCHV_FLAG, EffectiveFrom, EffectiveTo,  CurrentFlag)
              values (id, firstname, lastname, CREATE_DTTM, MODIF_DTTM, ARCHV_FLAG,'1800-01-01', NULL ,1)
WHEN MATCHED and tt.[CurrentFlag] = 1 
       AND exists
                (select ss.id, ss.firstname, ss.lastname, ss.CREATE_DTTM, ss.MODIF_DTTM, ss.ARCHV_FLAG
                except
                select tt.id, tt.firstname, tt.lastname, tt.CREATE_DTTM, tt.MODIF_DTTM, tt.ARCHV_FLAG
                )
      THEN UPDATE set tt.[CurrentFlag] = 0
                        , tt.[EffectiveTo] = ss.[MODIF_DTTM]
       OUTPUT $Action Action_Taken
              , ss.id, ss.firstname, ss.lastname, ss.CREATE_DTTM, ss.MODIF_DTTM, ss.ARCHV_FLAG
              , ss.[MODIF_DTTM] AS [EffectiveFrom]
              , NULL AS [EffectiveTo]
              ,1 AS [CurrentFlag]
)
AS MERGE_OUT
WHERE MERGE_OUT.Action_Taken = 'UPDATE';
select @@ROWCOUNT

我使用select @@ROWCOUNT 获得了更新的记录,但我正在为inserted records 苦苦挣扎。有人可以帮忙吗?

【问题讨论】:

    标签: sql-server tsql merge sql-server-2008-r2


    【解决方案1】:

    你可以这样做:

    OUTPUT $action, inserted.Column_Name 
    

    在 MERGE 结束时。 例如。这就是我们在使用 MERGE 时所做的事情。我们首先声明一个表变量:

    DECLARE @tableVar TABLE 
    (MergeAction VARCHAR(20), 
    InsertedID INT)
    

    然后在 MERGE 广告的末尾:

    OUTPUT
          $action, inserted.Column_name 'inserted' INTO @tableVar
    

    【讨论】:

    • 嗨@Mangal Pardeshi,在上面的代码中我已经注释了行,我尝试使用表变量但它说错误。我应该在哪里声明并且在 OUT 子句中还有一些列进入,那么如何插入?
    • 您应该在 MERGE 语句之前声明表,应该在最顶部,在您的情况下甚至在 INSERT 之前。
    • 嗨@Mangal Pardeshi,感谢您的回复。我按照你提到的那样尝试了,但是当我插入@tablevariable 时它说错误。例如:OUTPUT $Action Action_Taken INTO @tableVar , ss.id, ss.firstname, ss.lastname, ss.CREATE_DTTM, ss.MODIF_DTTM, ss.ARCHV_FLAG , ss.[MODIF_DTTM] AS [EffectiveFrom] , NULL AS [EffectiveTo] ,1 AS [CurrentFlag] )
    【解决方案2】:

    为了跟踪 SCD2 Merge Statement 中插入的行,我通常在 Merge Statement 之后使用以下脚本:

    SELECT COUNT(*) FROM dbo.table_target WHERE valid_from = @begin_in_date AND loadid = @loadid

    到目前为止,还没有找到更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-01-06
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多