合并示例 - 同步源和目标表
要说明 MERGE 声明,请考虑以下两个表 -
-
dbo.Product :此表包含有关该公司当前销售的产品的信息
-
dbo.ProductNew :此表包含有关该公司将来销售的产品的信息。
以下 T-SQL 将创建并填充这两个表
IF OBJECT_id(N'dbo.Product',N'U') IS NOT NULL
DROP TABLE dbo.Product
GO
CREATE TABLE dbo.Product (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(64),
PRICE MONEY
)
IF OBJECT_id(N'dbo.ProductNew',N'U') IS NOT NULL
DROP TABLE dbo.ProductNew
GO
CREATE TABLE dbo.ProductNew (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(64),
PRICE MONEY
)
INSERT INTO dbo.Product VALUES(1,'IPod',300)
,(2,'IPhone',400)
,(3,'ChromeCast',100)
,(4,'raspberry pi',50)
INSERT INTO dbo.ProductNew VALUES(1,'Asus Notebook',300)
,(2,'Hp Notebook',400)
,(3,'Dell Notebook',100)
,(4,'raspberry pi',50)
现在,假设我们想要将 dbo.Product 目标表与 dbo.ProductNew 表同步。以下是此任务的标准:
-
存在于 dbo.ProductNew 源表和 dbo.Product 目标表中的产品将在 dbo.Product 目标表中使用新的新产品进行更新。
-
dbo.Product 目标表中不存在的 dbo.ProductNew 源表中的任何产品都将插入到 dbo.Product 目标表中。
-
必须从 dbo.Product 目标表中删除 dbo.Product 目标表中不存在于 dbo.ProductNew 源表中的任何产品。以下是执行此任务的 MERGE 语句。
MERGE dbo.Product AS SourceTbl
USING dbo.ProductNew AS TargetTbl ON (SourceTbl.ProductID = TargetTbl.ProductID)
WHEN MATCHED
AND SourceTbl.ProductName <> TargetTbl.ProductName
OR SourceTbl.Price <> TargetTbl.Price
THEN UPDATE SET SourceTbl.ProductName = TargetTbl.ProductName,
SourceTbl.Price = TargetTbl.Price
WHEN NOT MATCHED
THEN INSERT (ProductID, ProductName, Price)
VALUES (TargetTbl.ProductID, TargetTbl.ProductName, TargetTbl.Price)
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT $action, INSERTED.*, DELETED.*;
注意:分号必须出现在 MERGE 语句的末尾。 https://i.stack.imgur.com/GULoi.jpg