SQL Server 2008的实用小道具——merger

数据库 SQL Server
作为SQL Server 2008中推出的一个小道具merger,具备插入,删除,修改一起来(适合数据的同步)的功能。让我们一起来认识它吧。

根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。

A. 使用 MERGE 在单个语句中对表执行 UPDATE 和 DELETE 操作

下面的示例使用 MERGE 根据 SalesOrderDetail 表中已处理的订单,每天更新 AdventureWorks 示例数据库中的 ProductInventory 表。通过减去每天对 SalesOrderDetail 表中的每种产品所下的订单数,更新 ProductInventory 表的 Quantity 列。如果某种产品的订单数导致该产品的库存量下降到 0 或更少,则会从 ProductInventory 表中删除该产品对应的行。

  1. USE AdventureWorks;  
  2. GO  
  3. IF OBJECT_ID (N'Production.usp_UpdateInventory', N'P'
  4. IS NOT NULL DROP PROCEDURE Production.usp_UpdateInventory;  
  5. GO  
  6. CREATE PROCEDURE Production.usp_UpdateInventory  
  7.     @OrderDate datetime  
  8. AS 
  9. MERGE Production.ProductInventory AS target  
  10. USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod  
  11.     JOIN Sales.SalesOrderHeader AS soh  
  12.     ON sod.SalesOrderID = soh.SalesOrderID  
  13.     AND soh.OrderDate = @OrderDate  
  14.     GROUP BY ProductID) AS source (ProductID, OrderQty)  
  15. ON (target.ProductID = source.ProductID)  
  16. WHEN MATCHED AND target.Quantity - source.OrderQty <= 0  
  17.     THEN DELETE 
  18. WHEN MATCHED  
  19.     THEN UPDATE SET target.Quantity = target.Quantity - source.OrderQty,  
  20.                     target.ModifiedDate = GETDATE()  
  21. OUTPUT $action, Inserted.ProductID, Inserted.Quantity, Inserted.ModifiedDate, Deleted.ProductID,  
  22.     Deleted.Quantity, Deleted.ModifiedDate;  
  23. GO  
  24.  
  25. EXECUTE Production.usp_UpdateInventory '20030501' 

B. 借助派生的源表,使用 MERGE 对目标表执行 UPDATE 和 INSERT 操作

下面的示例使用 MERGE 以更新或插入行的方式来修改 SalesReason 表。当源表中的 NewName 值与目标表 (SalesReason) 的 Name 列中的值匹配时,就会更新此目标表中的 ReasonType 列。当 NewName 的值不匹配时,就会将源行插入到目标表中。此源表是一个派生表,它使用 Transact-SQL 行构造函数功能指定源表的多个行。有关在派生表中使用行构造函数的详细信息,请参阅 FROM (Transact-SQL)。

  1. USE AdventureWorks;  
  2. GO  
  3. MERGE INTO Sales.SalesReason AS Target  
  4. USING (VALUES ('Recommendation','Other'), ('Review''Marketing'), ('Internet''Promotion'))  
  5.        AS Source (NewName, NewReasonType)  
  6. ON Target.Name = Source.NewName  
  7. WHEN MATCHED THEN 
  8.  UPDATE SET ReasonType = Source.NewReasonType  
  9. WHEN NOT MATCHED BY TARGET THEN 
  10.  INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  
  11. OUTPUT $action, inserted.*, deleted.*; 

C. 将 MERGE 语句的执行结果插入到另一个表中
下例捕获从 MERGE 语句的 OUTPUT 子句返回的数据,并将该数据插入另一个表。MERGE 语句根据在 SalesOrderDetail 表中处理的订单,更新 ProductInventory 表的 Quantity 列。本示例捕获已更新的行,并将这些行插入用于跟踪库存变化的另一个表中。

  1. USE AdventureWorks;  
  2. GO  
  3. CREATE TABLE Production.UpdatedInventory  
  4.     (ProductID INT NOT NULL, LocationID int, NewQty int, PreviousQty int,  
  5.      CONSTRAINT PK_Inventory PRIMARY KEY CLUSTERED (ProductID, LocationID));  
  6. GO  
  7. INSERT INTO Production.UpdatedInventory  
  8. SELECT ProductID, LocationID, NewQty, PreviousQty  
  9. FROM 
  10. (    MERGE Production.ProductInventory AS pi  
  11.      USING (SELECT ProductID, SUM(OrderQty)  
  12.             FROM Sales.SalesOrderDetail AS sod  
  13.             JOIN Sales.SalesOrderHeader AS soh  
  14.             ON sod.SalesOrderID = soh.SalesOrderID  
  15.             AND soh.OrderDate BETWEEN '20030701' AND '20030731' 
  16.             GROUP BY ProductID) AS src (ProductID, OrderQty)  
  17.      ON pi.ProductID = src.ProductID  
  18.     WHEN MATCHED AND pi.Quantity - src.OrderQty >= 0  
  19.         THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty  
  20.     WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0  
  21.         THEN DELETE 
  22.     OUTPUT $action, Inserted.ProductID, Inserted.LocationID, Inserted.Quantity AS NewQty, Deleted.Quantity AS PreviousQty)  
  23.  AS Changes (Action, ProductID, LocationID, NewQty, PreviousQty) WHERE Action = 'UPDATE';  
  24. GO 

原文标题:SQL SERVER 2008的几个新东西:插入,删除,修改一起来(适合数据的同步)-----merger

链接: http://www.cnblogs.com/buaaboyi/archive/2010/09/05/1818281.html

【编辑推荐】

  1. SQL Server 2000删除实战演习
  2. SQL Server存储过程的命名标准如何进行?
  3. 卸载SQL Server 2005组件的正确顺序
  4. 对SQL Server字符串数据类型的具体描述
  5. SQL Server数据类型的种类与应用
责任编辑:彭凡 来源: 博客园
相关推荐

2011-03-29 12:42:25

SQL Server 高效性

2009-04-16 17:34:19

2009-04-16 17:44:31

2009-04-16 18:15:19

动作审核审核活动SQL Server

2010-07-16 17:03:35

SQL Server

2009-04-16 17:55:15

扩展热插拔SQL Server

2011-05-24 13:33:45

2011-03-15 13:57:46

2009-04-16 18:25:55

2009-04-27 15:02:42

SQL Server 数据库引擎升级

2011-03-29 13:10:56

SQL Server

2010-07-21 11:26:07

SQL Server

2010-07-13 10:22:06

SQL Server

2011-05-24 13:39:49

SQL Server

2009-02-16 13:21:25

数据挖掘SQL Server SQL Server

2011-03-29 11:21:47

SQL Server 商业智能

2010-11-10 10:27:58

访问SQL Serve

2009-02-24 13:15:22

FILESTREAM新特性SQL Server

2010-03-23 09:52:23

SQL Server

2011-02-18 17:31:18

SQL Server
点赞
收藏

51CTO技术栈公众号