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

作为SQL Server 2008中推出的一个小道具merger,具备插入,删除,修改一起来(适合数据的同步)的功能。让我们一起来认识它吧。

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

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. 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

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

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

原文地址:https://www.cnblogs.com/lqh168/p/11433077.html

时间: 2025-01-03 17:33:22

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

sql server 2008 R2 压缩备份数据库

今天需要把一个省外项目的数据库从服务器上备份.拷贝到本机(跨地域传输数据库备份文件). 连上VPN,通过远程桌面连接,连接上服务器,发现数据库文件已经有20G以上大小了. 文件太大,公司网络也不稳定,根本不可能通过网络传输过来. 于是,把数据库的恢复模式由"完整"模式设置为"简单"模式,接着收缩数据库, 数据库瞬间由20G变成1G多点. 在SSMS中,新建查询窗口,执行数据库备份语句: --定义变量,把备份数据库的QL脚本赋值给变量 declare @SqlBack

初学SQL Server 2008数据库_1

前言(也就是一些废话) 在学SQL Server数据库之前,我们老师刚刚讲完了数据库原理这门课,说是讲完,其实只是讲到了第七章的一部分,后面的都没有讲.我们用的教材是施伯乐的那本数据库系统教程第三版,我学的还算是凑合吧,上上机课时,老师用的是Access数据库,所以我对Access也会一点:还有就是去年曾经看过一点点Oracle数据库:学Java时也曾简单的用过MySQL数据库. 平时所说的数据库,是指该数据库相应的管理软件. 曾听人说过,数据库并不算难,难的是如何使用数据库管理软件,的确,如果

SQL Server 2008从基础开始学习历程(1)------创建表与查询

[by:yy] 无论我们学什么呢,都要讲究一个Why,一个How.那么我们为什么要学SQL呢?无非就那么几点. 1.为了适应其他技术,和其他技术配对而学. 我个人的理解呢,只要在IT行业,无论你学什么,或者做什么工作.都离不开数据库.而学习数据库呢,又太文字化了,看的心里就烦.我是很抵触文字的.看着一大排一大排的字,就怕.可能是大天朝的教育所致.已经怕了学生生涯了. 2.为了适应社会而学. 随便找个招聘信息,都会有标注需要会SQL语言啊.了解MySql呀.会搞Oracle呀.所以呢,为了能在找工

【SQL Server性能优化】SQL Server 2008该表压缩

当数据库是比较大的,而当你想备份,我们可以启动数据库备份压缩.这项由于备份文件比较小的压缩,所以整个备份的更快的速度,同时还低了磁盘空间的消耗. 当然还有一方面.肯定会添加cpu的消耗.只是一般的server都是多核.所以实际上对系统不会有大的影响. 事实上.不仅能够在备份的时候压缩,在SQL Server 2008中.我们还能够对表和索引进行压缩,以下通过压缩前.压缩后的比較.来展示SQL Server 2008强大的表及索引的压缩功能. 这里在公司測试数据库找了一个中型的表,共同拥有943万

Windows2003操作系统SQL Server 2008安装图解(详细)

最近不少用户在windows2003 server 32位操作系统上安装SQL Server2008总是失败,出现大量错误.今天经过通过我反复测试安装,找出了一个便捷的安装方法,节省大家宝贵时间,具体方法如下,供大家参考: 准备工作: 首先需要下载下面这个软件 1.Windows Installer 4.5 Redistributable - 简体中文 下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=8483下载时选择:W

atitit.故障排除--- 当前命令发生了严重错误。应放弃任何可能产生的结果sql server 2008

atitit.故障排除--- 当前命令发生了严重错误.应放弃任何可能产生的结果sql server 2008 1. 现象 1 2. 原因:::sql server的bug 或者限制,查询的时候儿使用资源太多超过操作系统/防火墙/安全软件的限制... 2 2.1. 防火墙/安全软件的原因:自动关闭了长时连接and 资源多的连接.. 2 2.2. 并发连接数超过了其承载量,服务器会将其中一些连接Down掉: 2 3. 解决之道:: 2 3.1. 打补丁sp 2 3.2. 使用top n /where

SQL Server 2008的一些新特点及独到之处

SQL Server 2008的一些新特点及独到之处: 设置和安装 SQL Server 2008的设置和安装也有所改进.配置数据和引擎位已经分开了,所以它使创建基本的未配置系统的磁盘图像变得可能了,它使分布到多个服务器变得更容易了.从微软的站点也可以找到安装可用的最新更新.另一个特点是有能力把安装SQL.SP和补丁做一个单一的步骤进行了.另一个的最后的特点是,有能力卸载SP了. 关键的领域 当回顾微软关于SQL Server 2008的文档时注意到的第一条就是术语分类的特点和用途分组的特点.或

SQL Server 2008安装图解(详细)

今天以前一直用的SQL Server 2005做开发,偶尔也用MySQL,现入手公司项目,用到SQL Server 2008,于是乎必须安装它,免得出现其他很纠结的小问题,现将自己安装图解分享如下: 1.点开其Setup.exe 2.点击左侧安装: 3.选择"全新安装或向现有安装添加功能" 4.确定,等待一段时间后 5.点击下一步: 6.接受并下一步: 7 Next: 8.点击下一步 9.继续下一步: 10.点击下一步: 11.对所有SQL Server服务使用相同账户,下一步: 12

SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.具有使用 Microsoft Visual Studio 进行 Microsoft .NET Framework开发的经验. 4.具有