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 ;
答案 0 :(得分:0)
不幸的是,MERGE命令本身并没有提供捕获ACTION计数的方法。
然而,您可以做的是添加另一个步骤来计算您正在记录它们的表中的ACTION结果,假设您有某种审计键或日期列可用于将结果与最近的执行。