【问题标题】:Capturing Insert ,Update and Delete counts from Merge从合并中捕获插入、更新和删除计数
【发布时间】:2021-09-16 16:12:12
【问题描述】:

我使用下面的 T-SQL Merge 语句将数据从事务数据库增量加载到数据仓库。此 Merge 语句将数据加载为 SCD 类型 2,并且运行良好。

--Begin handling SCD2 changes
INSERT INTO  [DWDB].[dbo].[Dim_Warehouse]      
    (
         stg.[WarehouseID]
        ,stg.[WarehouseCode]
        ,stg.[WarehouseName]
    )   
SELECT 
         MERGE_OUT.[WarehouseID]
        ,MERGE_OUT.[WarehouseCode]
        ,MERGE_OUT.[WarehouseName]
FROM     
    (
        MERGE [DWDB].[dbo].[Dim_Warehouse] AS stg
        USING SourceDB.dbo.Warehouse AS SRC    
        ON (stg.WarehouseID = SRC.WarehouseID) 
    WHEN NOT MATCHED     
        THEN INSERT VALUES
            (
             SRC.[WarehouseID]
            ,SRC.[WarehouseCode]
            ,SRC.[WarehouseName]
            )
    WHEN MATCHED
        AND stg.dw_EndDate IS NULL
        AND 
            (
              stg.[WarehouseName]   <> src.[WarehouseName]
            ) 

        THEN
            UPDATE 
            SET  stg.dw_EndDate =  GETDATE()
                ,stg.dw_IsCurrent = 0 
    OUTPUT $action Action_Out
            ,SRC.[WarehouseID]
            ,SRC.[WarehouseCode]
            ,SRC.[WarehouseName]
            ) AS MERGE_OUT
WHERE MERGE_OUT.Action_Out = 'UPDATE';

(为了简单起见,从上面的源代码中删除了一些列)

我最后的工作是依靠 MERGE 语句来知道有多少记录被插入、更新、删除但没有成功。

我已尝试创建一个临时表并将列放入 OUTPUT 中,如以下链接所示:Sql Server 2008 MERGE - best way to get countshttps://www.purplefrogsystems.com/blog/2012/01/using-t-sql-merge-to-load-data-warehouse-dimensions/ 但它看起来与我的情况不同。

非常感谢您的帮助。

【问题讨论】:

  • “它看起来与我的情况不同”是什么意思?这是否意味着结果不是您所期望的? .这有帮助吗? sqlservercentral.com/articles/…
  • 您好 Nick.McDermaid,感谢您的回复。通常我们使用 Merge....输出 Inserted.*, Deleted.* 到临时表中(例如临时表 @archive 作为您建议的链接)。但在我的情况下,我不能使用这种方式,因为在 OUTPUT 之后,我使用 ") AS MERGE_OUT WHERE MERGE_OUT.Action_Out = 'UPDATE'" 如您所见。你能教我如何使用临时表来存储我的合并的插入、更新、删除次数吗?

标签: sql merge scd warehouse


【解决方案1】:

为了正确使用术语,@archive 是一个表变量,而不是一个临时表。 (它们在很多方面都不同)。临时表看起来像这样#archive

要解决您的问题,您可以像往常一样简单地加载到表变量中,然后从该表变量中插入。此活动分为两个步骤。不需要一步到位。

另外仅供参考,根本不需要使用合并,您可以使用单独的插入/更新语句。很多人没有意识到这一点。还要记住merge 的问题列表。它们大多是边缘情况,但请记住还有其他选择

https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

      -- Create the table variable to capture the output
      DECLARE @MergeOutput (
            Action_Out VARCHAR(100),
            [WarehouseID] INT,
            [WarehouseCode] VARCHAR(50),
            [WarehouseName] VARCHAR(50)
      );


        -- mere into table, capturing output into table variable
        MERGE [DWDB].[dbo].[Dim_Warehouse] AS stg
        USING SourceDB.dbo.Warehouse AS SRC    
        ON (stg.WarehouseID = SRC.WarehouseID) 
        WHEN NOT MATCHED     
        THEN INSERT VALUES
            (
             SRC.[WarehouseID]
            ,SRC.[WarehouseCode]
            ,SRC.[WarehouseName]
            )
    WHEN MATCHED
        AND stg.dw_EndDate IS NULL
        AND 
            (
              stg.[WarehouseName]   <> src.[WarehouseName]
            ) 

        THEN
            UPDATE 
            SET  stg.dw_EndDate =  GETDATE()
                ,stg.dw_IsCurrent = 0 
    OUTPUT $action Action_Out
            ,SRC.[WarehouseID]
            ,SRC.[WarehouseCode]
            ,SRC.[WarehouseName]
    INTO @MergeOutput

-- Perform insert based on table variable
INSERT INTO  [DWDB].[dbo].[Dim_Warehouse]      
    (
         [WarehouseID]
        ,[WarehouseCode]
        ,[WarehouseName]
    )   
SELECT 
         [WarehouseID]
        ,[WarehouseCode]
        ,[WarehouseName]
FROM @MergeOutput
WHERE Action_Out = 'UPDATE';

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多