SQLServer2008的實(shí)用小道具 merger使用介紹
更新時(shí)間:2010年09月12日 21:42:40 作者:
根據(jù)在另一個(gè)表中找到的差異在一個(gè)表中插入、更新或刪除行,可以對(duì)兩個(gè)表進(jìn)行同步。
A. 使用 MERGE 在單個(gè)語(yǔ)句中對(duì)表執(zhí)行 UPDATE 和 DELETE 操作
下面的示例使用 MERGE 根據(jù) SalesOrderDetail 表中已處理的訂單,每天更新 AdventureWorks 示例數(shù)據(jù)庫(kù)中的 ProductInventory 表。通過(guò)減去每天對(duì) SalesOrderDetail 表中的每種產(chǎn)品所下的訂單數(shù),更新 ProductInventory 表的 Quantity 列。如果某種產(chǎn)品的訂單數(shù)導(dǎo)致該產(chǎn)品的庫(kù)存量下降到 0 或更少,則會(huì)從 ProductInventory 表中刪除該產(chǎn)品對(duì)應(yīng)的行。
B. 借助派生的源表,使用 MERGE 對(duì)目標(biāo)表執(zhí)行 UPDATE 和 INSERT 操作
下面的示例使用 MERGE 以更新或插入行的方式來(lái)修改 SalesReason 表。當(dāng)源表中的 NewName 值與目標(biāo)表 (SalesReason) 的 Name 列中的值匹配時(shí),就會(huì)更新此目標(biāo)表中的 ReasonType 列。當(dāng) NewName 的值不匹配時(shí),就會(huì)將源行插入到目標(biāo)表中。此源表是一個(gè)派生表,它使用 Transact-SQL 行構(gòu)造函數(shù)功能指定源表的多個(gè)行。有關(guān)在派生表中使用行構(gòu)造函數(shù)的詳細(xì)信息,請(qǐng)參閱 FROM (Transact-SQL)。
C. 將 MERGE 語(yǔ)句的執(zhí)行結(jié)果插入到另一個(gè)表中
下例捕獲從 MERGE 語(yǔ)句的 OUTPUT 子句返回的數(shù)據(jù),并將該數(shù)據(jù)插入另一個(gè)表。MERGE 語(yǔ)句根據(jù)在 SalesOrderDetail 表中處理的訂單,更新 ProductInventory 表的 Quantity 列。本示例捕獲已更新的行,并將這些行插入用于跟蹤庫(kù)存變化的另一個(gè)表中
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'
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.*;
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.*;
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
下面的示例使用 MERGE 根據(jù) SalesOrderDetail 表中已處理的訂單,每天更新 AdventureWorks 示例數(shù)據(jù)庫(kù)中的 ProductInventory 表。通過(guò)減去每天對(duì) SalesOrderDetail 表中的每種產(chǎn)品所下的訂單數(shù),更新 ProductInventory 表的 Quantity 列。如果某種產(chǎn)品的訂單數(shù)導(dǎo)致該產(chǎn)品的庫(kù)存量下降到 0 或更少,則會(huì)從 ProductInventory 表中刪除該產(chǎn)品對(duì)應(yīng)的行。
B. 借助派生的源表,使用 MERGE 對(duì)目標(biāo)表執(zhí)行 UPDATE 和 INSERT 操作
下面的示例使用 MERGE 以更新或插入行的方式來(lái)修改 SalesReason 表。當(dāng)源表中的 NewName 值與目標(biāo)表 (SalesReason) 的 Name 列中的值匹配時(shí),就會(huì)更新此目標(biāo)表中的 ReasonType 列。當(dāng) NewName 的值不匹配時(shí),就會(huì)將源行插入到目標(biāo)表中。此源表是一個(gè)派生表,它使用 Transact-SQL 行構(gòu)造函數(shù)功能指定源表的多個(gè)行。有關(guān)在派生表中使用行構(gòu)造函數(shù)的詳細(xì)信息,請(qǐng)參閱 FROM (Transact-SQL)。
C. 將 MERGE 語(yǔ)句的執(zhí)行結(jié)果插入到另一個(gè)表中
下例捕獲從 MERGE 語(yǔ)句的 OUTPUT 子句返回的數(shù)據(jù),并將該數(shù)據(jù)插入另一個(gè)表。MERGE 語(yǔ)句根據(jù)在 SalesOrderDetail 表中處理的訂單,更新 ProductInventory 表的 Quantity 列。本示例捕獲已更新的行,并將這些行插入用于跟蹤庫(kù)存變化的另一個(gè)表中
復(fù)制代碼 代碼如下:
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'
復(fù)制代碼 代碼如下:
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.*;
復(fù)制代碼 代碼如下:
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.*;
復(fù)制代碼 代碼如下:
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
相關(guān)文章
sql2008 還原數(shù)據(jù)庫(kù)解決方案
本文將介紹如何利用bak恢復(fù)數(shù)據(jù)庫(kù),以sql2008 還原數(shù)據(jù)庫(kù)為例進(jìn)行介紹,需要的朋友可以參考下2012-11-11解決sql server2008注冊(cè)表寫入失敗,vs2013核心功能安裝失敗
本文給大家分享的是作者在更換硬盤后全新安裝sql server2008以及VS2013的過(guò)程中遇到的注冊(cè)表無(wú)法寫入的問(wèn)題以及解決方法,分享給大家,希望大家能夠喜歡2017-10-10Java連接sqlserver2008數(shù)據(jù)庫(kù)代碼
這篇文章主要介紹了Java連接sqlserver2008代碼,需要的朋友可以參考下2017-04-04sql2008 hql語(yǔ)句翻譯過(guò)來(lái)的分頁(yè)語(yǔ)句介紹
有的時(shí)候,是為了讓SQL語(yǔ)句的可讀性更高些,也有可能是在UNION ALL的不同部分,作為提供數(shù)據(jù)的部分。 特別對(duì)于UNION ALL比較有用2013-06-06SQL Server 2008網(wǎng)絡(luò)協(xié)議深入理解
可以通過(guò)展開(kāi)SQL Server 2008網(wǎng)絡(luò)配置節(jié)點(diǎn)進(jìn)行服務(wù)器協(xié)議的配置,需要了解更多的朋友可以參考本文2012-11-11sql server 2008中的apply運(yùn)算符使用方法
sql server 2008中的apply運(yùn)算符使用方法,需要的朋友可以參考一下2013-05-05SQL Server2008中刪除重復(fù)記錄的方法分享
在Database中可能由于某種原因如用戶輸入,導(dǎo)入數(shù)據(jù)失敗等 導(dǎo)致了重復(fù)記錄. 如果你沒(méi)有用主鍵,約束,或來(lái)其它機(jī)制實(shí)現(xiàn)數(shù)據(jù)完整性,那最后總是重復(fù)記錄在你的數(shù)據(jù)庫(kù)中.2011-10-10win2008 r2安裝SQL SERVER 2008 R2 不能打開(kāi)1433端口設(shè)置方法
這篇文章主要介紹了win2008 r2安裝SQL SERVER 2008 R2 不能打開(kāi)1433端口設(shè)置方法,需要的朋友可以參考下2017-01-01