关于sqlserver 的merge 操作

本文介绍 SQL Server 中 MERGE 语句的使用方法,相当于 MySQL 的 INSERT INTO ON DUPLICATE KEY UPDATE。通过示例代码展示了如何实现数据的更新与插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单记录一下,sqlserver中的merge相当于 mysql 中的 Insert into on duplicated

code:

create table mergetest(
  id uniqueidentifier primary key,
  name varchar(50)
)

 --insert into mergetest(id,name) values(newid(),'kevin');

select * from mergetest;

merge into mergetest as T
using (
values
('5E8BF9D8-8479-40BE-BF28-85F3C0336B68','newKevin'),
(newid(),'Lanister')) AS sourceMergeTest(id,name)
ON T.id= sourceMergeTest.id

WHEN MATCHED THEN
     UPDATE
          set name=sourceMergeTest.name
WHEN NOT MATCHED THEN
     INSERT
          VALUES(id,name);

因为merge的用法一般情况是连接两张表,所以 如果我们 要做类似于 mysql中的 insert on duplicate的 操作的话 需要将插入的值 模拟城一个新的表,上面的代码就是values 后面的操作 然后 AS 然后 ON

–记录于 16/6/29

### SQL ServerMERGE 语句的用法 #### 语法结构 `MERGE` 是一种用于执行有条件数据操作的强大工具,在单个语句中可以实现 `INSERT`、`UPDATE` 和 `DELETE` 功能。其基本语法如下: ```sql MERGE INTO TargetTable AS target USING SourceTable AS source ON match_condition WHEN MATCHED THEN UPDATE SET column1 = source.column1, column2 = source.column2, ... WHEN NOT MATCHED BY TARGET THEN INSERT (column1, column2, ...) VALUES (source.column1, source.column2, ...) WHEN NOT MATCHED BY SOURCE THEN DELETE; ``` 此语法允许指定源 (`SourceTable`) 和目标 (`TargetTable`) 的匹配条件 (`match_condition`). 如果记录存在于两者之中,则更新;如果仅存在于源则插入新纪录到目标;反之,当某条记录只出现在目标而不在源时可以选择删除该记录[^1]. #### 使用示例 下面是一个具体的例子来展示如何利用 `MERGE` 来同步两个格中的客户信息。 假设有一个名为 `CustomersNew` 的临时包含了最新的顾客列以及另一个长期存储这些资料的目标叫做 `Customers`. 下面这段代码会将新的或更改过的客户加入到永久性的数据库里,并移除那些不再存在的旧客户: ```sql -- 创建测试环境所需的两张 CREATE TABLE Customers ( CustomerID INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(50), Email NVARCHAR(100) ); CREATE TABLE CustomersNew ( CustomerID INT, Name NVARCHAR(50), Email NVARCHAR(100) ); -- 插入一些初始数据以便演示 INSERT INTO Customers (Name, Email) VALUES ('Alice', 'alice@example.com'); INSERT INTO Customers (Name, Email) VALUES ('Bob', 'bob@example.com'); INSERT INTO CustomersNew (CustomerID, Name, Email) VALUES (NULL,'Charlie','charlie@newexample.com'); -- 新增用户 Charlie INSERT INTO CustomersNew (CustomerID, Name, Email) VALUES (1,'Alicia','alicia@updatedemail.com'); -- 更新 Alice 邮箱地址 INSERT INTO CustomersNew (CustomerID, Name, Email) VALUES (2,NULL,'bob@unchanged.com'); -- Bob 数据不变 -- 执行 MERGE 操作 MERGE INTO Customers AS CusTgt USING CustomersNew AS CusSrc ON CusTgt.CustomerID = CusSrc.CustomerID WHEN MATCHED AND CusSrc.Name IS NOT NULL THEN UPDATE SET CusTgt.Name = CusSrc.Name, CusTgt.Email = CusSrc.Email WHEN NOT MATCHED BY TARGET THEN INSERT (Name, Email) VALUES (CusSrc.Name, CusSrc.Email) WHEN NOT MATCHED BY SOURCE THEN DELETE; SELECT * FROM Customers; -- 查看最终结果 DROP TABLE Customers, CustomersNew; -- 清理创建的测试 ``` 上述脚本展示了完整的流程:定义好要处理的数据集之后,通过 `MERGE` 命令实现了三类动作——对于已存在并有变化的信息进行了修改(`UPDATE`);遇到完全不存在的新成员就添加进去(`INSERT`);最后还清除了任何已经消失不见的老顾客(`DELETE`)[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值