具有多个语句的SQL Merge Into



我正试图保留另一个的历史表。当更新原始文件时,我想将行插入到历史文件中。我正在使用Sql合并:

MERGE TargetProducts AS Target
USING SourceProducts    AS Source
ON Source.ProductID = Target.ProductID

-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (ProductID,ProductName, Price) 
VALUES (Source.ProductID,Source.ProductName, Source.Price)

-- For Updates
WHEN MATCHED THEN UPDATE SET
Target.ProductName  = Source.ProductName,
Target.Price        = Source.Price

-- For Deletes
WHEN NOT MATCHED BY Source THEN
DELETE;

我可以在同一个";CCD_ 1";条件例如:

...
-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (ProductID,ProductName, Price) VALUES (Source.ProductID,Source.ProductName, Source.Price);
INSERT INTO anotherTable (OldProductID,OldProductName, OldPrice) VALUES (Source.ProductID,Source.ProductName, Source.Price);
...

通常您只能将INSERT放入一个表中。该语法不允许在同一"语句"中有多个语句;当";条件

但是,SQL Server有OUTPUT子句,它允许添加另一个表。当您需要某种审计跟踪时,它非常方便。

请参阅以下问题如何从一个SELECT语句插入多个表

因此,将OUTPUT子句添加到MERGE语句中。类似这样的东西:

MERGE TargetProducts AS Target
USING SourceProducts    AS Source
ON Source.ProductID = Target.ProductID

-- For Inserts
WHEN NOT MATCHED BY Target THEN
INSERT (ProductID,ProductName, Price) 
VALUES (Source.ProductID,Source.ProductName, Source.Price)

-- For Updates
WHEN MATCHED THEN UPDATE SET
Target.ProductName  = Source.ProductName,
Target.Price        = Source.Price

-- For Deletes
WHEN NOT MATCHED BY Source THEN
DELETE
OUTPUT inserted.ProductID, inserted.ProductName, inserted.Price
INTO anotherTable (OldProductID,OldProductName, OldPrice)
;

这将捕获anotherTable中的更新和插入。要只捕获插入,您可以先输出到临时表中,然后通过MERGE$action过滤结果。

看看这个问题:

DBMS级别的管道和过滤器:拆分MERGE输出流

最新更新