新入门的SQL Server和合并。
我正在编写一条MERGE语句来填充一个缓慢变化的维度表。我的示例包括类型1和类型2属性。我看到了如何使用OUTPUT捕获操作计数的示例,并且了解了如何使用OUTPUT将值传递给INSERT语句。我想要做的是采用以下代码,并以某种方式捕获更新和插入操作的计数,以便进行审计/日志记录。
非常困惑地阅读关于输出和输出的文章,但根据我所能说的,我认为我不能做我想做的事情,至少不使用输出。
有没有一种方法可以从下面的语句中捕获操作计数?有没有更好的方法来实现这一点?
谢谢
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 ;发布于 2015-03-04 18:55:39
不幸的是,MERGE命令本身并不提供捕获操作计数的方法。
但是,假设您有某种审计关键字或日期列,可以用来将结果与最近的执行分开,那么您可以做的是添加另一个步骤,对您要记录的表中的操作结果进行计数。
https://stackoverflow.com/questions/28487074
复制相似问题