SQLSERVER merge的简单用法

 MERGE INTO TEST_IN_COPY3 a USING (
SELECT
'武汉-北京998' AS NAME,
'2017 - 11 - 21 11 : 53 : 49.0000000 + 00 : 00' AS datetimeoffseta,
'2017-11-10 11:52:20' AS datetim2e,
998 AS ID,
'2017-11-07 11:52:10' AS datetimea,
'2017-11-10 00:00:00' AS datea,
5.5600 AS numerica,
5.55 AS floata
) b ON (a.ID = b.ID)
WHEN MATCHED THEN
UPDATE
SET a.NAME = b.NAME,
 a.datetimeoffseta = b.datetimeoffseta,
 a.datetim2e = b.datetim2e,
 a.datetimea = b.datetimea,
 a.datea = b.datea,
 a.numerica = b.numerica,
 a.floata = b.floata
WHEN NOT MATCHED THEN
INSERT (
NAME,
datetimeoffseta,
datetim2e,
ID,
datetimea,
datea,
numerica,
floata
)
VALUES
(
b.NAME,
b.datetimeoffseta,
b.datetim2e,
b.ID,
b.datetimea,
b.datea,
b.numerica,
b.floata

) ;


下面是主要的同步操作

MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象

USING 与源表连接 ON 关联的条件

WHEN MATCHED - 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中)

WHEN NOTMATCHED BY TARGET - 如果匹配不成功 (TARGET 中没有这一条记录但是 SOURCE 表有,说明 SOURCE 表多了新数据因此应该插入到 TARGET 表中)

WHEN NOTMATCHED BY SOURCE - 如果匹配不成功 (SOURCE 中没有这一条记录但是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,所以 TARGET 也应该删除)

MERGE INTO @TargetTable AS T           
USING @SourceTable AS S                
   ON T.ID = S.ID                      
WHEN MATCHED         
   THEN UPDATE SET T.DSPT = S.DSPT  
WHEN NOT MATCHED BY TARGET   
   THEN INSERT VALUES(S.ID,S.DSPT)
WHEN NOT MATCHED BY SOURCE            
   THEN DELETE
OUTPUT $ACTION AS [ACTION],
   Deleted.ID AS 'Deleted ID',
   Deleted.DSPT AS 'Deleted Description',
   Inserted.ID AS 'Inserted ID',
   Inserted.DSPT AS 'Inserted Description'
INTO @Log;

还要注意的是有一些限制条件:

  • 在 Merge Matched 操作中,只能允许执行 UPDATE 或者 DELETE 语句。
  • 在 Merge Not Matched 操作中,只允许执行 INSERT 语句。
  • 一个 Merge 语句中出现的 Matched 操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误 - An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.
  • Merge 语句最后必须包含分号,以 ; 结束。

执行一下上面的 MERGE 语句查看一下结果,两个表的数据一模一样了 -

ID = 1,2,3 的记录在 Source 表和Target 表都存在,因此执行的是 UPDATE 操作。

ID = 4,5 的记录在 Source 表存在,但是在 Target 表不存在,因此执行的是 INSERT 操作。

ID = 6,7 的记录在 Target 表存在,但是在 Source 表不存在,因此执行的是 DELETE 操作。

22222222222222

使用merge同时执行insert和update操作

我们经常会有这样的需求,根据某个字段或多个字段查找表中的一行或多行数据,如果查找成功得到匹配项,更新其中的其他一个或多个字段;如果查找失败则将“某个字段或多个字段”作为新的一行中的数据插入到表中。第一种方法是先更新,然后根据@@rowcount判断是否有匹配项,如果没有则插入。先使用下面的 代码创建一个存储过程。

复制代码
  
  
1 use AdventureWorks
2 go
3 create procedure dbo.InsertUnitMeasure @UnitMeasureCode nchar ( 3 ), @Name nvarchar ( 25 )
4 as
5 begin
6 set nocount on ;
7 update Production.UnitMeasure set Name = @Name where UnitMeasureCode = @UnitMeasureCode
8 if ( @@ROWCOUNT = 0 )
9 begin
10 insert into Production.UnitMeasure(Name,UnitMeasureCode) values ( @Name , @UnitMeasureCode )
11 end
12 end
13 go
复制代码

记得见过这样的笔试题目,要求是插入不存在的行,只要把上面语句中的update改成select就可以了,当时没有写出来,现在恍然大悟,也许是在考察@@ROWCOUNT的用法吧。这个语句也可以使用merge语句实现。下面我们使用merge关键字来修改这个存储过程。

复制代码
  
  
1 alter procedure dbo.InsertUnitMeasure @UnitMeasureCode nchar ( 3 ), @Name nvarchar ( 25 )
2 as
3 begin
4 set nocount on
5 merge Production.UnitMeasure as target
6 using ( select @UnitMeasureCode , @Name ) as source (UnitMeasureCode,Name)
7 on (target.UnitMeasureCode = source.UnitMeasureCode)
8 when matched then update set Name = source.Name
9 when not matched then insert (UnitMeasureCode,Name) values (source.UnitMeasureCode,Name)
10 output deleted. * ,$action,inserted. * into MyTempTable;
11 end
12 go
复制代码

这个语句使用merge修改存储过程,这个语句中又出现我不太了解的关键字using和$action。Using是用来指定和表InsertUnitMeasure中相匹配的数据源,这里的数据源来自外部输入,是通过两个输入参数得到。$action可能是一个占位符,表示上面的when字句进行的操作








  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL Server中的MERGE INTO语句用于将数据从一个表合并到另一个表中。它可以根据指定的条件更新或插入数据。MERGE INTO语句需要指定源表和目标表,并且需要指定用于匹配行的列。然后,您可以指定要执行的操作,例如更新、插入或删除。MERGE INTO语句可以帮助您更有效地管理数据,并减少编写复杂SQL语句的需要。 ### 回答2: SQL Server中的MERGE INTO语句是一种有用的功能,可以在两个或更多表中进行数据合并(插入、更新或删除)。这个语句结合了INSERT、UPDATE和DELETE语句的功能,使得在进行数据合并时更加的方便,同时避免了执行三个不同语句时可能遇到的一些问题。 首先,MERGE INTO语句的基本语法如下: ``` MERGE INTO targetTable USING sourceTable ON joinCondition WHEN MATCHED THEN UPDATE SET targetColumn = sourceColumn WHEN NOT MATCHED THEN INSERT (targetColumn1, targetColumn2, ...) VALUES (sourceColumn1, sourceColumn2, ...) ``` 这个语句由两个部分组成:源表和目标表。使用表之前必须先定义好JOIN过程,包括定义表之间的关系和匹配条件。当匹配时,在目标表中更新相应的列,否则插入一个新的行。此外,MERGE INTO还有一些其他的参数可以使用,如DELETE语句等。 要使用MERGE INTO语句进行数据合并,首先需要确保源表和目标表具有相同的列名和数据类型,以确保数据可以正确合并。其次,需要确保在执行MERGE INTO语句之前已经关闭了对目标表的所有约束和触发器,这样可以避免在合并数据时发生错误。最后,需要注意MERGE INTO语句执行顺序,首先执行DELETE操作,然后执行UPDATE操作,最后执行INSERT操作。 使用MERGE INTO语句进行数据合并可以大大简化SQL Server数据库管理的工作。使用它可以减少需要编写的代码数量,并在同时执行多个操作时提供了更高效的方法。此外,MERGE INTO还可以让开发人员更加容易地维护代码,以实现更好的可读性和可重用性。综上所述,使用MERGE INTO语句进行数据合并是一种非常有用和重要的SQL Server数据库管理方法。 ### 回答3: SQL Server的Merge语句是一种相对较新的聚合语句。它的主要作用是将源表的数据合并到目标表中,同时实现插入、更新、删除数据的操作。使用SQL Server Merge语句可以有效简化重复插入、删除和更新的操作,也可以根据需要执行多个操作。 使用SQL Server Merge语句时,首先需要指定目标表,或已存在的一个命名聚合表,表中包含需要更新、插入或删除的记录。接着,需要指定“合并规则”,即当源数据与目标数据之间存在冲突时如何处理。合并规则通常包括以下几种情况: 1. 目标表中有而源表中没有的数据,需要插入。 2. 源表和目标表中都存在的数据,需要根据匹配键进行更新。 3. 目标表中有而源表中没有的数据,需要删除。 4. 源表和目标表都存在的数据,但是在目标表中被标记为“已删除”,需要恢复。 对于每个规则,可以指定相应的SQL语句。例如,当源表和目标表中都存在的数据需要更新时,可以使用UPDATE语句。如果目标表中有但源表中没有的数据需要插入,则可以使用INSERT语句。 总的来说,SQL Server Merge语句使得数据合并操作更加高效和易于管理。但需要注意的是,Merge语句需要仔细测试和验证,以确保它能够正确地执行所需的操作,并避免数据的丢失或冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值