作为SQL Server 2008中推出的一个小道具merger,具备插入,删除,修改一起来(适合数据的同步)的功能。让我们一起来认识它吧。
根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。
A. 使用 MERGE 在单个语句中对表执行 UPDATE 和 DELETE 操作
下面的示例使用 MERGE 根据 SalesOrderDetail 表中已处理的订单,每天更新 AdventureWorks 示例数据库中的 ProductInventory 表。通过减去每天对 SalesOrderDetail 表中的每种产品所下的订单数,更新 ProductInventory 表的 Quantity 列。如果某种产品的订单数导致该产品的库存量下降到 0 或更少,则会从 ProductInventory 表中删除该产品对应的行。
- USEAdventureWorks;
- GO
- IFOBJECT_ID(N'Production.usp_UpdateInventory',N'P')
- ISNOTNULLDROPPROCEDUREProduction.usp_UpdateInventory;
- GO
- CREATEPROCEDUREProduction.usp_UpdateInventory
- @OrderDatedatetime
- AS
- MERGEProduction.ProductInventoryAStarget
- USING(SELECTProductID,SUM(OrderQty)FROMSales.SalesOrderDetailASsod
- JOINSales.SalesOrderHeaderASsoh
- ONsod.SalesOrderID=soh.SalesOrderID
- ANDsoh.OrderDate=@OrderDate
- GROUPBYProductID)ASsource(ProductID,OrderQty)
- ON(target.ProductID=source.ProductID)
- WHENMATCHEDANDtarget.Quantity-source.OrderQty<=0
- THENDELETE
- WHENMATCHED
- THENUPDATESETtarget.Quantity=target.Quantity-source.OrderQty,
- target.ModifiedDate=GETDATE()
- OUTPUT$action,Inserted.ProductID,Inserted.Quantity,Inserted.ModifiedDate,Deleted.ProductID,
- Deleted.Quantity,Deleted.ModifiedDate;
- GO
- EXECUTEProduction.usp_UpdateInventory'20030501'
B. 借助派生的源表,使用 MERGE 对目标表执行 UPDATE 和 INSERT 操作
下面的示例使用 MERGE 以更新或插入行的方式来修改 SalesReason 表。当源表中的 NewName 值与目标表 (SalesReason) 的 Name 列中的值匹配时,就会更新此目标表中的 ReasonType 列。当 NewName 的值不匹配时,就会将源行插入到目标表中。此源表是一个派生表,它使用 Transact-SQL 行构造函数功能指定源表的多个行。有关在派生表中使用行构造函数的详细信息,请参阅 FROM (Transact-SQL)。
- USEAdventureWorks;
- GO
- MERGEINTOSales.SalesReasonASTarget
- USING(VALUES('Recommendation','Other'),('Review','Marketing'),('Internet','Promotion'))
- ASSource(NewName,NewReasonType)
- ONTarget.Name=Source.NewName
- WHENMATCHEDTHEN
- UPDATESETReasonType=Source.NewReasonType
- WHENNOTMATCHEDBYTARGETTHEN
- INSERT(Name,ReasonType)VALUES(NewName,NewReasonType)
- OUTPUT$action,inserted.*,deleted.*;
C. 将 MERGE 语句的执行结果插入到另一个表中
下例捕获从 MERGE 语句的 OUTPUT 子句返回的数据,并将该数据插入另一个表。MERGE 语句根据在 SalesOrderDetail 表中处理的订单,更新 ProductInventory 表的 Quantity 列。本示例捕获已更新的行,并将这些行插入用于跟踪库存变化的另一个表中。
- USEAdventureWorks;
- GO
- CREATETABLEProduction.UpdatedInventory
- (ProductIDINTNOTNULL,LocationIDint,NewQtyint,PreviousQtyint,
- CONSTRAINTPK_InventoryPRIMARYKEYCLUSTERED(ProductID,LocationID));
- GO
- INSERTINTOProduction.UpdatedInventory
- SELECTProductID,LocationID,NewQty,PreviousQty
- FROM
- (MERGEProduction.ProductInventoryASpi
- USING(SELECTProductID,SUM(OrderQty)
- FROMSales.SalesOrderDetailASsod
- JOINSales.SalesOrderHeaderASsoh
- ONsod.SalesOrderID=soh.SalesOrderID
- ANDsoh.OrderDateBETWEEN'20030701'AND'20030731'
- GROUPBYProductID)ASsrc(ProductID,OrderQty)
- ONpi.ProductID=src.ProductID
- WHENMATCHEDANDpi.Quantity-src.OrderQty>=0
- THENUPDATESETpi.Quantity=pi.Quantity-src.OrderQty
- WHENMATCHEDANDpi.Quantity-src.OrderQty<=0
- THENDELETE
- OUTPUT$action,Inserted.ProductID,Inserted.LocationID,Inserted.QuantityASNewQty,Deleted.QuantityASPreviousQty)
- ASChanges(Action,ProductID,LocationID,NewQty,PreviousQty)WHEREAction='UPDATE';
- GO
原文标题:SQL SERVER 2008的几个新东西:插入,删除,修改一起来(适合数据的同步)-----merger
链接:http://www.cnblogs.com/buaaboyi/archive/2010/09/05/1818281.html
【编辑推荐】
- SQL Server 2000删除实战演习
- SQL Server存储过程的命名标准如何进行?
- 卸载SQL Server 2005组件的正确顺序
- 对SQL Server字符串数据类型的具体描述
- SQL Server数据类型的种类与应用