Merge是关于对于两个表之间的数据进行操作的。

要使用Merge的场景比如:

  • 数据同步
  • 数据转换
  • 基于源表对目标表做Insert,Update,Delete操作

MERGE语句的基本语法:

MERGE 目标表

USING 源表

ON 匹配条件

WHEN MATCHED THEN

语句

WHEN NOT MATCHED THEN

语句;

以上是MERGE的最最基本的语法,语句执行时根据匹配条件的结果,如果在目标表中找到匹配记录则执行WHEN MATCHED THEN后面的语句,如果没有找到匹配记录则执行WHEN NOT MATCHED THEN后面的语句。注意源表可以是表,也可以是一个子查询语句

Merge关键字的一些限制

  • 使用Merge关键字只能更新一个表
  • 源表中不能有重复的记录

使用范例

MERGE ProductNew AS d
USING
Product
AS s
ON s.ProductID = d.ProductId
WHEN NOT MATCHED THEN
INSERT( ProductID,ProductName,Price)
VALUES(s.ProductID,s.ProductName,s.Price)
WHEN MATCHED THEN
UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
MERGE ProductNew AS d
USING
Product
AS s
ON s.ProductID = d.ProductId
WHEN NOT MATCHED BY TARGET THEN
INSERT( ProductID,ProductName,Price)
VALUES(s.ProductID,s.ProductName,s.Price)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
WHEN MATCHED THEN
UPDATE SET d.ProductName = s.ProductName, d.Price = s.Price;
DECLARE @ID int;
DECLARE @isNew as bit = ; MERGE CUSTOMER WITH(ROWLOCK) as target
using(select @accountID as AccountID) as source
on target.ACCOUNT_ID = Source.AccountID AND target.IS_DELETE =
WHEN MATCHED THEN
UPDATE set CNAME = @cname
,NICKNAME = @nikename
,MOBILE = @mobile
,CERTIFICATE_TYPE = @certificatetype
,CERTIFICATE_CODE = @certificatecode
,ADDRESS = @address
,PHOTO_URL = @photourl
,BIRTHDAY = @birthday
,CAREER = @career
,GENDER = @gender
,HEIGHT = @heigth
,WEIGHT = @weight
,REGIST_ON = @regison
,MODIFIED_ON = GETDATE()
,VERSION = target.VERSION +
,@ID = target.ID
WHEN NOT MATCHED THEN
INSERT (CNAME
,NICKNAME
,MOBILE
,CERTIFICATE_TYPE
,CERTIFICATE_CODE
,ADDRESS
,PHOTO_URL
,BIRTHDAY
,CAREER
,GENDER
,HEIGHT
,WEIGHT
,REGIST_ON
,ACCOUNT_ID
,IS_DELETE
,CREATED_ON
,MODIFIED_ON
,VERSION
,GUID
,SYSTEM_TYPE
,PRIORITY)
values(@cname
,@nikename
,@mobile
,@certificatetype
,@certificatecode
,@address
,@photourl
,@birthday
,@career
,@gender
,@heigth
,@weight
,@regison
,@accountID
,
,GETDATE()
,GETDATE()
,
,NEWID()
,
,); if @ID is NULL
begin
set @ID = SCOPE_IDENTITY()
set @isNew = ;
end;
SELECT @ID as ID,@isNew as IsNew;

Sql server使用Merge关键字做插入或更新操作的更多相关文章

  1. SQL Server 使用 Merge 关键字进行表数据同步

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  2. SQL server存储过程:数据的插入和更新

    存储过程的功能非常强大,在某种程度上甚至可以替代业务逻辑层, 接下来就一个小例子来说明,用存储过程插入或更新语句. 1.数据库表结构 所用数据库为Sql Server2008. 2.创建存储过程 (1 ...

  3. Sql server的Merge语句,源表中如果有重复数据会导致执行报错

    用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说 ...

  4. 【转载】SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    原文地址:SQL Server - 使用 Merge 语句实现表数据之间的对比同步 表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT ...

  5. SQL Server大量数据秒级插入/新增/删除

    原文:SQL Server大量数据秒级插入/新增/删除 1.快速保存,该方法有四个参数,第一个参数为数据库连接,第二个参数为需要保存的DataTable,该参数的TableName属性需要设置为数据库 ...

  6. 【转】SQL Server 创建约束图解 唯一 主键-界面操作

    SQL Server 创建约束图解 唯一 主键-界面操作 SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束, ...

  7. SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...

  8. 转:SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

  9. SQL Server - 使用 Merge 语句实现表数据之间的对比同步

    表数据之间的同步有很多种实现方式,比如删除然后重新 INSERT,或者写一些其它的分支条件判断再加以 INSERT 或者 UPDATE 等.包括在 SSIS Package 中也可以通过 Lookup ...

随机推荐

  1. linux-redhat6.4驱动无线网卡rtl8188eu

    无线网卡Realtek Semiconductor Cop. RTL8188EUS  首先下载安装包: ​其中的0BDA是Realtek的代码,8179是设备代码.从网上查到这个设备的芯片是rtl81 ...

  2. 我了个大擦-PDO(二)

    hi 昨天又213了,虽然有室友3点多才睡觉的客观影响,但是昨晚不想学东西是本质原因.今天搞起.打算3.4天之内,学完PDO和AJAX这两个,还望大家没事儿来骂骂我,免的我又偷懒. 1.PDO 二.P ...

  3. Codeforces 549G Happy Line[问题转换 sort]

    G. Happy Line time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. save()、saveOrUpdate()、merge()的区别

    一.Save() save()方法能够保存实体到数据库.假如两个实体之间有关系(例如employee表和address表有一对一关系),如果在没有事务的情况下调用这个方法保存employee这个实体, ...

  5. HMAC算法AS3版

    http://www.cnblogs.com/appleseed/archive/2008/09/17/1292232.html

  6. [No00000A]计算机的存储单位

    位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位. 字节 byte:8个二进制[bit (比特)(Binary Digits)]位为一个字节(B), ...

  7. java 22 - 20 多线程之线程池

    程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...

  8. bzoj2548[Cstc2002]灭鼠行动

    Description 最近,有一些繁殖力很强的老鼠在下水道非常猖獗,灭鼠特工队正在计划消灭这些老鼠.下水道只有东西方向和南北方向的管道,如图所示. 灭鼠特工队的队员拥有强大的武器.他们将在某些时刻t ...

  9. Android4.0-Fragment框架实现方式剖析(一)

    1.什么是Fragment? Fragment包含在Activity中,Fragment只能存在于Activity的上下文(context)内,没有Activity就无 法使用Fragment,因此F ...

  10. javascript里面this机制的几个例子

    javascript里面的this值会随着使用场景的不同二发生变化,但是总有一个原则,那就是this总指向当前调用函数的那个对象.以下我会举几个例子来说明这个问题.1.this本身总是指向当前的类的实 ...