当前位置:Gxlcms > 数据库问题 > SQL Server 2008的实用小道具——merger

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

时间:2021-07-01 10:21:17 帮助过:23人阅读

  • IS NOT NULL DROP PROCEDURE Production.usp_UpdateInventory;  
  • GO  
  • CREATE PROCEDURE Production.usp_UpdateInventory  
  •     @OrderDate datetime  
  • AS 
  • MERGE Production.ProductInventory AS target  
  • USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod  
  •     JOIN Sales.SalesOrderHeader AS soh  
  •     ON sod.SalesOrderID = soh.SalesOrderID  
  •     AND soh.OrderDate = @OrderDate  
  •     GROUP BY ProductID) AS source (ProductID, OrderQty)  
  • ON (target.ProductID = source.ProductID)  
  • WHEN MATCHED AND target.Quantity - source.OrderQty <= 0  
  •     THEN DELETE 
  • WHEN MATCHED  
  •     THEN UPDATE SET target.Quantity = target.Quantity - source.OrderQty,  
  •                     target.ModifiedDate = GETDATE()  
  • OUTPUT $action, Inserted.ProductID, Inserted.Quantity, Inserted.ModifiedDate, Deleted.ProductID,  
  •     Deleted.Quantity, Deleted.ModifiedDate;  
  • GO  
  •  
  • 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

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

    标签:sre   根据   nbsp   tar   recommend   删除   订单   red   一起   

    人气教程排行