加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer2008的实用小道具 merger使用说明

发布时间:2023-07-31 14:59:35 所属栏目:MsSql教程 来源:
导读:A. 使用 MERGE 在单个语句中对表执行 UPDATE 和 DELETE 操作

  下面的示例使用 MERGE 根据 SalesOrderDetail 表中已处理的订单,每天更新 AdventureWorks 示例数据库中的 ProductInventory 表。通过减去每天对
A. 使用 MERGE 在单个语句中对表执行 UPDATE 和 DELETE 操作
 
  下面的示例使用 MERGE 根据 SalesOrderDetail 表中已处理的订单,每天更新 AdventureWorks 示例数据库中的 ProductInventory 表。通过减去每天对 SalesOrderDetail 表中的每种产品所下的订单数,更新 ProductInventory 表的 Quantity 列。如果某种产品的订单数导致该产品的库存量下降到 0 或更少,则会从 ProductInventory 表中删除该产品对应的行。
 
  B. 借助派生的源表,使用 MERGE 对目标表执行 UPDATE 和 INSERT 操作
 
  下面的示例使用 MERGE 以更新或插入行的方式来修改 SalesReason 表。当源表中的 NewName 值与目标表 (SalesReason) 的 Name 列中的值匹配时,就会更新此目标表中的 ReasonType 列。当 NewName 的值不匹配时,就会将源行插入到目标表中。此源表是一个派生表,它使用 Transact-sql 行构造函数功能指定源表的多个行。有关在派生表中使用行构造函数的详细信息,请参阅 FROM (Transact-sql)。   C. 将 MERGE 语句的执行结果插入到另一个表中
 
  下例捕获从 MERGE 语句的 OUTPUT 子句返回的数据,并将该数据插入另一个表。MERGE 语句根据在 SalesOrderDetail 表中处理的订单,更新 ProductInventory 表的 Quantity 列。本示例捕获已更新的行,并将这些行插入用于跟踪库存变化的另一个表中
 
<div class="codetitle"><a style="CURSOR: pointer" data="16973" class="copybut" id="copybut16973" onclick="doCopy('code16973')"> 代码如下:
 
<div class="codebody" id="code16973">
 
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'
 
<div class="codetitle"><a style="CURSOR: pointer" data="8687" class="copybut" id="copybut8687" onclick="doCopy('code8687')"> 代码如下:
 
<div class="codebody" id="code8687">
 
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.;
 
<div class="codetitle"><a style="CURSOR: pointer" data="8687" class="copybut" id="copybut8687" onclick="doCopy('code8687')"> 代码如下:
 
<div class="codebody" id="code8687">
 
USE AdventureWorks;
 
GO
 
MERGE INTO Sales.SalesReason AS Target
 
USING (VALUES ('Recommendation',deleted.*;
 
<div class="codetitle"><a style="CURSOR: pointer" data="26182" class="copybut" id="copybut26182" onclick="doCopy('code26182')"> 代码如下:
 
<div class="codebody" id="code26182">
 
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.LocationID,Inserted.Quantity AS NewQty,Deleted.Quantity AS PrevIoUsQty)
 
AS Changes (Action,ProductID,PrevIoUsQty) WHERE Action = 'UPDATE';
 
GO
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章