【发布时间】: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 counts 和 https://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'" 如您所见。你能教我如何使用临时表来存储我的合并的插入、更新、删除次数吗?