投资菜地

屋后的一亩三分绿色菜园地

2017-11-29

Sql Server 使用技巧 - 插入更新

在对性能苛求的场景,可以选用MERGE语句,实现Upsert功能。以下是MERGE语句的优点:

  1. 快 数据库引擎需要解析编译每次的执行,如果使用多个执行语句必降低性能。
  2. 简 MERGE语句比较简单易懂
  3. 省 在同一个事务中处理不需要额外写事务成功失败的逻辑
  4. 多 功能更多,除了匹配更新,不匹配插入,还可以实现匹配删除,不匹配更新等操作

CREATE TABLE MyTable
    (
      id INT PRIMARY KEY ,
      name VARCHAR(100) ,
      salary MONEY
    );
GO
INSERT  INTO MyTable
        SELECT  1 ,
                'Catherine Donnel' ,
                200000;
INSERT  INTO MyTable
        SELECT  2 ,
                'Stacey Kost' ,
                150000;
INSERT  INTO MyTable
        SELECT  3 ,
                'Jason Leanos' ,
                36000;
INSERT  INTO MyTable
        SELECT  4 ,
                'Catherine O''Donnel' ,
                20000;
INSERT  INTO MyTable
        SELECT  5 ,
                'Rainbow Dance' ,
                20000;

GO
CREATE TABLE MyTable2
    (
      id INT PRIMARY KEY ,
      name VARCHAR(100) ,
      salary MONEY
    );
GO
INSERT  INTO MyTable2
        SELECT  1 ,
                'Catherine O''Donnel' ,
                220000;
INSERT  INTO MyTable2
        SELECT  2 ,
                'Stacey Kostue' ,
                230000;
INSERT  INTO MyTable2
        SELECT  4 ,
                'Catherine Bonaparte' ,
                20000;
INSERT  INTO MyTable2
        SELECT  9 ,
                'Irina Zolotrova' ,
                40000;
INSERT  INTO MyTable2
        SELECT  5 ,
                'Eva Jane' ,
                40034;
GO
 

MERGE INTO MyTable AS Target
USING MyTable2 AS Source
ON Target.id = Source.id
WHEN MATCHED THEN
    UPDATE SET Target.name = Source.name ,
               Target.salary = Source.salary
WHEN NOT MATCHED THEN
    INSERT ( id, name, salary )
    VALUES ( Source.id ,
             Source.name ,
             Source.salary
           );

开源项目(更多)