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

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

SQL Server 2008的实用小道具——merger(sql server 2008使用方法)  merger 2008 第1张

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

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

  1. USEAdventureWorks;
  2. GO
  3. IFOBJECT_ID(N'Production.usp_UpdateInventory',N'P')
  4. ISNOTNULLDROPPROCEDUREProduction.usp_UpdateInventory;
  5. GO
  6. CREATEPROCEDUREProduction.usp_UpdateInventory
  7. @OrderDatedatetime
  8. AS
  9. MERGEProduction.ProductInventoryAStarget
  10. USING(SELECTProductID,SUM(OrderQty)FROMSales.SalesOrderDetailASsod
  11. JOINSales.SalesOrderHeaderASsoh
  12. ONsod.SalesOrderID=soh.SalesOrderID
  13. ANDsoh.OrderDate=@OrderDate
  14. GROUPBYProductID)ASsource(ProductID,OrderQty)
  15. ON(target.ProductID=source.ProductID)
  16. WHENMATCHEDANDtarget.Quantity-source.OrderQty<=0
  17. THENDELETE
  18. WHENMATCHED
  19. THENUPDATESETtarget.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. EXECUTEProduction.usp_UpdateInventory'20030501'

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

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

  1. USEAdventureWorks;
  2. GO
  3. MERGEINTOSales.SalesReasonASTarget
  4. USING(VALUES('Recommendation','Other'),('Review','Marketing'),('Internet','Promotion'))
  5. ASSource(NewName,NewReasonType)
  6. ONTarget.Name=Source.NewName
  7. WHENMATCHEDTHEN
  8. UPDATESETReasonType=Source.NewReasonType
  9. WHENNOTMATCHEDBYTARGETTHEN
  10. INSERT(Name,ReasonType)VALUES(NewName,NewReasonType)
  11. OUTPUT$action,inserted.*,deleted.*;

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

  1. USEAdventureWorks;
  2. GO
  3. CREATETABLEProduction.UpdatedInventory
  4. (ProductIDINTNOTNULL,LocationIDint,NewQtyint,PreviousQtyint,
  5. CONSTRAINTPK_InventoryPRIMARYKEYCLUSTERED(ProductID,LocationID));
  6. GO
  7. INSERTINTOProduction.UpdatedInventory
  8. SELECTProductID,LocationID,NewQty,PreviousQty
  9. FROM
  10. (MERGEProduction.ProductInventoryASpi
  11. USING(SELECTProductID,SUM(OrderQty)
  12. FROMSales.SalesOrderDetailASsod
  13. JOINSales.SalesOrderHeaderASsoh
  14. ONsod.SalesOrderID=soh.SalesOrderID
  15. ANDsoh.OrderDateBETWEEN'20030701'AND'20030731'
  16. GROUPBYProductID)ASsrc(ProductID,OrderQty)
  17. ONpi.ProductID=src.ProductID
  18. WHENMATCHEDANDpi.Quantity-src.OrderQty>=0
  19. THENUPDATESETpi.Quantity=pi.Quantity-src.OrderQty
  20. WHENMATCHEDANDpi.Quantity-src.OrderQty<=0
  21. THENDELETE
  22. OUTPUT$action,Inserted.ProductID,Inserted.LocationID,Inserted.QuantityASNewQty,Deleted.QuantityASPreviousQty)
  23. ASChanges(Action,ProductID,LocationID,NewQty,PreviousQty)WHEREAction='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数据类型的种类与应用
转载请说明出处
知优网 » SQL Server 2008的实用小道具——merger(sql server 2008使用方法)

发表评论

您需要后才能发表评论