当前位置:首页 > 系统运维 > 正文内容

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

a8116255316年前 (2010-09-06)系统运维8

根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。

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 

原文标题:SQL SERVER 2008的几个新东西:插入,删除,修改一起来(适合数据的同步)-----merger

链接: http://www.cnblogs.com/buaaboyi/archive/2010/09/05/1818281.html

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://2345hao.cn/blog/index.php/post/22348.html

分享给朋友:

“SQL Server 2008的实用小道具——merger” 的相关文章

各个都很实用:windows 7系统电脑日常小技巧

各个都很实用:windows 7系统电脑日常小技巧

在使用Windows 7的时候很多用户对于系统的很多功能并不是很了解,也正是因为这样的不了解导致很多用户在使用Win 之后并不能体验Windows 7的功能便携和强大功能,导致很多用户对于Windows 7的认识还是比较模糊,不过为了让更多的朋友了解Windows 7的特点和便携应用,今天就为大家汇...

Win 7系统中其他声音正常但酷狗音乐没声音怎么回事

Win 7系统中其他声音正常但酷狗音乐没声音怎么回事

故障现象: Windows 7酷狗软件无声音,系统声音正常。 原因分析: 1. 查看酷狗软件设置 2. 查看系统设置 解决方案: 1. Windows 7操作方法 如图:查看是否处于禁音状态   Windows 7系统声音正常酷狗音乐无声音 2. 查看设置音频输出是否...

解决windows 7无法将程序锁定到任务栏或附到开始菜单的方法

解决windows 7无法将程序锁定到任务栏或附到开始菜单的方法

出现该问题的原因是由于使用第三方优化软件消除快捷方式的小箭头引起的。 1、在开始搜索框中键入“regedit”,按回车键打开注册表编辑器。 2、依次定位到以下分支:HKEY_CLASSES_ROOTlnkfile。 3、在lnkfile项上鼠标右键单击“新建”——“字符串值”。...

windows 7系统怎么取消禁ping命令?

windows 7系统怎么取消禁ping命令?

当我在虚拟机的linux系统中ping本机的ip发现ping不通,而本机可以ping通虚拟机中的ip。应该是出于安全考虑吧,Windows 7默认在防火墙里禁止了。 1、查看主机ip 打开“开始”程序中的“附件”,找到“命令提示符”打开。输入命令:ipconfig,可以看到本机的ip是192.1...

windows 7玩网游PING高即网络延时比较高的解决方法

windows 7玩网游PING高即网络延时比较高的解决方法

经常听见有人说用Windows 7玩网络游戏的时候网络延时比较高,也就是ping比平时xp的时候高一点,一直找不到原因,很苦恼。今天我们终于找到理由了,原来是Windows 7的一个服务在作怪,这个服务叫:Multimedia Class Scheduler,就是这个服务让我的PING如此高,问题是...

微软为windows 7用户重新发布补丁KB2952664 帮助提升Win10升级体

微软为windows 7用户重新发布补丁KB2952664 帮助提升Win10升级体

1月13日消息,微软今天为Windows 7(SP1)用户重新推送了编号为KB2952664的更新补丁,该更新在官方KB知识库中的描述为“Windows 7系统升级兼容性更新”,用于帮助微软改进当前版本系统,提升升级到最新版Win10系统的体验。 这项更新还用于在系统中显示Windows10更新提...