SQL Server 2008的實用小道具——merger
根據在另一個表中找到的差異在一個表中插入、更新或刪除行,可以對兩個表進行同步。
A. 使用 MERGE 在單個語句中對錶執行 UPDATE 和 DELETE 操作
下面的示例使用 MERGE 根據 SalesOrderDetail 表中已處理的訂單,每天更新 AdventureWorks 示例資料庫中的 ProductInventory 表。通過減去每天對 SalesOrderDetail 表中的每種產品所下的訂單數,更新 ProductInventory 表的 Quantity 列。如果某種產品的訂單數導致該產品的庫存量下降到 0 或更少,則會從 ProductInventory 表中刪除該產品對應的行。
- USE AdventureWorks;
- GO
- IF OBJECT_ID (N'Production.usp_UpdateInventory', N'P')
- 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)。
- USE AdventureWorks;
- GO
- MERGE INTO Sales.SalesReason AS Target
- USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))
- AS Source (NewName, NewReasonType)
- ON Target.Name = Source.NewName
- WHEN MATCHED THEN
- UPDATE SET ReasonType = Source.NewReasonType
- WHEN NOT MATCHED BY TARGET THEN
- INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)
- OUTPUT $action, inserted.*, deleted.*;
C. 將 MERGE 語句的執行結果插入到另一個表中
下例捕獲從 MERGE 語句的 OUTPUT 子句返回的資料,並將該資料插入另一個表。MERGE 語句根據在 SalesOrderDetail 表中處理的訂單,更新 ProductInventory 表的 Quantity 列。本示例捕獲已更新的行,並將這些行插入用於跟蹤庫存變化的另一個表中。
- USE AdventureWorks;
- GO
- CREATE TABLE Production.UpdatedInventory
- (ProductID INT NOT NULL, LocationID int, NewQty int, PreviousQty int,
- CONSTRAINT PK_Inventory PRIMARY KEY CLUSTERED (ProductID, LocationID));
- GO
- INSERT INTO Production.UpdatedInventory
- SELECT ProductID, LocationID, NewQty, PreviousQty
- FROM
- ( MERGE Production.ProductInventory AS pi
- USING (SELECT ProductID, SUM(OrderQty)
- FROM Sales.SalesOrderDetail AS sod
- JOIN Sales.SalesOrderHeader AS soh
- ON sod.SalesOrderID = soh.SalesOrderID
- AND soh.OrderDate BETWEEN '20030701' AND '20030731'
- GROUP BY ProductID) AS src (ProductID, OrderQty)
- ON pi.ProductID = src.ProductID
- WHEN MATCHED AND pi.Quantity - src.OrderQty >= 0
- THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
- WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
- THEN DELETE
- OUTPUT $action, Inserted.ProductID, Inserted.LocationID, Inserted.Quantity AS NewQty, Deleted.Quantity AS PreviousQty)
- AS Changes (Action, ProductID, LocationID, NewQty, PreviousQty) WHERE Action = 'UPDATE';
- GO
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-672951/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- SQL SERVER 2008安全配置SQLServer
- SQL Server 2008檔案流功能應用設想YCSQLServer
- SQL Server 2008中的行壓縮(上)JUSQLServer
- SQL SERVER實用技巧SQLServer
- SQL Server2008程式堵塞處理方法SQLServer
- Sql Server2008R2下載地址SQLServer
- SQL Server 2008連線字串寫法大全SQLServer字串
- 理解SQL Server 2008索引的儲存結構YDSQLServer索引
- SQL Server 2008的故障轉移叢集概述UBSQLServer
- Analysis Services基礎知識——深入SQL Server 2008SQLServer
- win10怎麼安裝sql server2008 r2_win10如何安裝sql server2008 r2Win10SQLServer
- Q&A:SQL Server 2008的升級與部署知識SOSQLServer
- SQL Server 2008事件處理系統簡介LSSQLServer事件
- SQL Server 2008 R2雙機熱備方案SQLServer
- 在SQL Server 2008中的SP上使用表型別值引數MHSQLServer型別
- 雲伺服器SQL Server 2008 允許遠端連線的配置伺服器SQLServer
- 五個實用的SQL Server PowerShell指令碼OMSQLServer指令碼
- SQL Server2008 R2 資料庫映象配置方案SQLServer資料庫
- 1.4 SQL Server2008安裝與配置(2020-12-1)SQLServer
- 關於SQL server2008除錯儲存過程的完整步驟SQLServer除錯儲存過程
- 注意:微軟將在2019年7月停止對SQL Server 2008的支援!微軟SQLServer
- SQL Server ceiling向上取小數SQLServer
- SQL Server 2000/2005/2008刪除或壓縮資料庫日誌的方法SQLServer資料庫
- SQL Server 2008資料複製新特性及其帶來的價值(下)XDSQLServer
- SQL Server 2008 R2並行資料倉儲簡介SZSQLServer並行
- Butterknife(10.0.0):Manifest merger failed的坑AI
- [NOIP2008 提高組] 笨小猴——map的應用
- Windows Server 2008 R2 伺服器常用命令小結WindowsServer伺服器
- sql serverSQLServer
- Windows server2008修改遠端桌面埠的方法WindowsServer
- SQL Server 的死鎖SQLServer
- Windows 10 下安裝Sql Server 2008 R2 連線到伺服器失敗WindowsSQLServer伺服器
- SQL Server Integration Services最佳實踐BTSQLServer
- Windows Server 2008 R2 下載地址WindowsServer
- SQL 第一章 SQL2008R2的安裝以及資料庫的簡單應用SQL資料庫
- 區分SQL Server 2008 R2資料中心和並行資料倉儲版本WBSQLServer並行
- Moebius for SQL ServerSQLServer
- sql server 使用SQLServer