SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx

功能:根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。

我们看一个例子,假如,有一总产品列表,一个分店产品列表,需要从分店添加产品时更新总产品列表。

总产品表,分店产品表结构完全一致:

if OBJECT_ID(‘Demo_AllProducts‘) is not null drop table Demo_AllProducts go Create table Demo_AllProducts (PKID int not null identity(1,1) primary key ,DName Nvarchar(20) null ,DCode NVarchar(30) null ,DDate datetime null ) go
--this SQL is only for SQL Server 2008 Insert into Demo_AllProducts (DName,DCode,DDate) values (‘DemoA‘,‘AAA‘,GETDATE()), (‘DemoB‘,‘BBB‘,GETDATE()), (‘DemoC‘,‘CCC‘,GETDATE()), (‘DemoD‘,‘DDD‘,GETDATE()), (‘DemoE‘,‘EEE‘,GETDATE())
select * from Demo_AllProducts
--PKID    DName    DCode    DDate --1    DemoA    AAA    2010-10-12 20:33:54.417 --2    DemoB    BBB    2010-10-12 20:33:54.417 --3    DemoC    CCC    2010-10-12 20:33:54.417 --4    DemoD    DDD    2010-10-12 20:33:54.417 --5    DemoE    EEE    2010-10-12 20:33:54.417

if OBJECT_ID(‘Demo_Shop1_Product‘) is not null drop table Demo_Shop1_Product go
Createtable Demo_Shop1_Product (PKID int not null identity(1,1) primary key ,DName Nvarchar(20) null ,DCode NVarchar(30) null ,DDate datetime null ) go
--this SQL is only for SQL Server 2008 Insert into Demo_Shop1_Product (DName,DCode,DDate) values (‘DemoA‘,‘AAA‘,GETDATE()), (‘DemoB‘,‘CCC‘,GETDATE()), (‘DemoF‘,‘FFF‘,GETDATE())
select * from Demo_Shop1_Product
--PKID    DName    DCode    DDate --1    DemoA    AAA    2010-10-17 20:19:32.767 --2    DemoB    CCC    2010-10-17 20:19:32.767 --3    DemoF    FFF    2010-10-17 20:19:32.767

假定现在需要将分店数据完全合并到总产品表中,以编码字段为依据,如果产品名称不致,则用分店的产品名称替换总产品名称。

如果总产品表中不存在,则添加。

可选项:如果分店表中不存在,则从总产品表中删除分店中没有的行。如果这样,总产品表和分店表就完全同步了。实际操作中可能不需要删除目标表的行。

语句如下:

--确定目标表 Merge Into Demo_AllProducts p --从数据源查找编码相同的产品 using Demo_Shop1_Product s on  p.DCode=s.DCode --如果编码相同,则更新目标表的名称 When Matched and P.DName<>s.DName Then Update set P.DName=s.DName --如果目标表中不存在,则从数据源插入目标表 When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate) --如果数据源的行在源表中不存在,则删除源表行 When Not Matched By Source Then Delete;

此时,执行完成后,两个表的行均如下:

--PKID    DName    DCode    DDate --1    DemoA    AAA    2010-10-17 20:31:00.827 --2    DemoB    CCC    2010-10-17 20:31:00.827 --3    DemoF    FFF    2010-10-17 20:31:00.827

如果不删除,语句如下:

--确定目标表 Merge Into Demo_AllProducts p --从数据源查找编码相同的产品 using Demo_Shop1_Product s on  p.DCode=s.DCode --如果编码相同,则更新目标表的名称 When Matched and P.DName<>s.DName Then Updateset P.DName=s.DName --如果目标表中不存在,则从数据源插入目标表 When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate);

执行后结果:

--PKID    DName    DCode    DDate --1    DemoA    AAA    2010-10-17 20:30:28.350 --2    DemoB    BBB    2010-10-17 20:30:28.350 --3    DemoB    CCC    2010-10-17 20:30:28.350 --4    DemoD    DDD    2010-10-17 20:30:28.350 --5    DemoE    EEE    2010-10-17 20:30:28.350 --6    DemoF    FFF    2010-10-17 20:31:00.827 --PKID    DName    DCode    DDate --1    DemoA    AAA    2010-10-17 20:31:00.827 --2    DemoB    CCC    2010-10-17 20:31:00.827 --3    DemoF    FFF    2010-10-17 20:31:00.827

如果需要记录Merge语句影响的行,可以用Output子句,如果仅仅需要知道影响的行数,可以使用@@ROWCOUNTROWCOUNT_BIG(),修改后的示例如下:

--定义表变量以存储输出 Declare@tableVarRecordTable (MPKID int not null identity(1,1) primary key ,PKID int null ,DName Nvarchar(20) null ,DCode NVarchar(30) null ,DDate datetime null )
--确定目标表 Merge Into Demo_AllProducts p --从数据源查找编码相同的产品 using Demo_Shop1_Product s on  p.DCode=s.DCode --如果编码相同,则更新目标表的名称 When Matched and P.DName<>s.DName Then Updateset P.DName=s.DName
--如果目标表中不存在,则从数据源插入目标表 When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate)
--如果数据源的行在源表中不存在,则删除目标表行 When Not Matched By Source Then Delete  OUTPUT deleted.* INTO @tableVarRecord; ----Delete  OUTPUT Inserted.* INTO @tableVarRecord; --返回上个Merge语句影响的行数 select @@ROWCOUNT as Count1,ROWCOUNT_BIG() as Count2
select * from @tableVarRecord;

结果:

--影响的行数 --Count1    Count2 --5    5 --Deleted表的行 --MPKID    PKID    DName    DCode    DDate --1    NULL    NULL    NULL    NULL --2    2    DemoB    BBB    2010-10-17 21:42:30.700 --3    3    DemoC    CCC    2010-10-17 21:42:30.700 --4    4    DemoD    DDD    2010-10-17 21:42:30.700 --5    5    DemoE    EEE    2010-10-17 21:42:30.700

关于@@ROWCOUNTROWCOUNT_BIG()的更多说明,请查阅MSDN:

http://technet.microsoft.com/zh-tw/library/ms187316.aspx 

http://msdn.microsoft.com/en-us/library/ms181406.aspx

如果影响的结果超过20亿,即整型的最大范围,请使用后者。

时间: 2024-08-28 11:55:29

SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)的相关文章

SQLServer 2008中SQL增强之三 Merge(在一条语句中使用

SQLServer 2008中SQL增强之三 Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MSDN:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 功能:根据与源表联接的结果,对目标表执行插入.更新或删除操作.例如,根据在另一个表中找到的差异在一个表中插入.更新或删除行,可以对两个表进行同步. 我们看一个例子,假如,有一总产品列表,一

SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案

原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的GIS专业理论知识. 5

SQL SERVER 2008查看sql执行的时间

set statistics profile onset statistics io onset statistics time ongo<这里写上你的语句...>goset statistics profile offset statistics io offset statistics time off 在下面的消息中会显示: SQL Server 分析和编译时间: CPU 时间 = 0 毫秒,占用时间 = 0 毫秒. (1000 行受影响)表 'memberlevelglide'.扫描计

SQL Server 2008 转换为 SQL 2005 数据库 脚本生成

本文讨论如何把数据库从SQL Server 2008版本降低到2005,因为在本地开发是以SQL Server 2008 Express Edition版本进行的,而主机提供商现在提供的MSSQL只支持到2005,所以需要把数据库版本给降下来.这个过程挺麻烦的,首先需要有SQL Server Management Studio 2008(简称SSMS),现在先来下载它. SQL Server Management Studio 2008 Express 下载(如 果你用的是XP操作系统,下载那个

sql点滴38—SQL Server 2008和SQL Server 2008 R2导出数据的选项略有不同

原文:sql点滴38—SQL Server 2008和SQL Server 2008 R2导出数据的选项略有不同 说明: 以前要将一个表中的数据导出为脚本,只有用存储过程.现在在SQL Server 2008中增加了一个新特性,除了导出表的定义外,还支持将表中的数据导出为脚本. 步骤: 右击需要导出数据的数据库,在弹出式菜单中选择“任务”下的“生成脚本”选项 在第二步选择“高级选项”如果不是2008(R2)的选择 "编写数据的脚本"选择为TRUE,这里默认是为FALSE的 , 是200

SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005

New xSQL Schema Compare - version 5 Compare the schemas of two SQL Server databases, review differences, generate synchronization script and execute it - xSQL Schema Compare makes database change management easy. xSQL Schema Compare supports SQL Serv

SQL SERVER 2008 升级至SQL SERVER 2012

1.sql server 2008 当前版本 Microsoft SQL Server Management Studio (10.0.6000.29) --sql server 2008 Microsoft Analysis Services 客户端工具(10.0.6000.29) Microsoft 数据访问组件 (MDAC) (6.1.7601.17514) Microsoft MSXML(3.0 6.0) Microsoft Internet Explorer(8.0.7601.1751

win10中打开SQL Server 2008 的SQL Server配置管理器方法

win10找不到SQL Server配置管理器 搜索 SQLServerManager10.msc,或者运行文件:“C:\Windows\SysWOW64\SQLServerManager10.msc” 原文地址:https://www.cnblogs.com/Zev_Fung/p/10332971.html

SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) 一条语句实现两表同步(添加、删除、修改)

MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; http://www.chinaz.com/program/2010/1014/137713.shtml