阐述SQL Server 2008道具——merger

    作者:数据库学习更新于: 2015-10-29 14:56:54

    下面,小编给大家带来的数据库教程内容是介绍SQL Server 2008的实用小道具——merger。这个大家可熟悉吗?如果你不了解的话,不妨往下进行了解。

    SQL Server 2008 在Microsoft的数据平台上发布,可以组织管理任何数据。可以将结构化、半结构化和非结构化文档的数据直接存储到数据库中。可以对数据进行查询、搜索、同步、报告和分析之类的操作。数据可以存储在各种设备上,从数据中心最大的服务器一直到桌面计算机和移动设备,它都可以控制数据而不用管数据存储在哪里。

    根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。
    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 

    以上内容虽然有点复杂,但却很有用,所以大家还是赶紧学一学吧!更多相关的数据库学习内容,可在课课家官方网进行学习,那儿有丰富的实践教程视频。

课课家教育

未登录