【发布时间】: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