SQL Server是否提供类似MySQL的ON DUPLICATE KEY UPDATE

Ben*_*old 56 mysql t-sql sql-server

在MySQL中,如果指定ON DUPLICATE KEY UPDATE且插入的行将导致UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行的UPDATE.例如,如果列a声明为UNIQUE并包含值1,则以下两个语句具有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;
Run Code Online (Sandbox Code Playgroud)

我不相信我在T-SQL中遇到过类似的东西.SQL Server是否提供了与MySQL的ON DUPLICATE KEY UPDATE相当的东西?

小智 44

没有DUPLICATE KEY UPDATE等价物,但MERGE和WHEN MATCHED可能适合您

使用MERGE插入,更新和删除数据

  • 请注意,MERGE不能免受高并发插入冲突的影响.你**必须**使用WITH(UPDLOCK,HOLDLOCK)进行合并才能不碰撞.一些超高事务/秒的系统使用不使用锁的不同策略,但是任何错误都被捕获,然后转换为更新. (14认同)

Iva*_*anD 35

我很惊讶这个页面上没有一个答案包含一个实际查询的例子,所以你走了:

插入数据然后处理重复的更复杂的示例

MERGE
INTO MyBigDB.dbo.METER_DATA WITH (HOLDLOCK) AS target
USING (SELECT
    77748 AS rtu_id
   ,'12B096876' AS meter_id
   ,56112 AS meter_reading
   ,'20150602 00:20:11' AS local_time) AS source
(rtu_id, meter_id, meter_reading, time_local)
ON (target.rtu_id = source.rtu_id
  AND target.time_local = source.time_local)
WHEN MATCHED
  THEN UPDATE
      SET meter_id = '12B096876'
         ,meter_reading = 56112
WHEN NOT MATCHED
  THEN INSERT (rtu_id, meter_id, meter_reading, time_local)
      VALUES (77748, '12B096876', 56112, '20150602 00:20:11');
Run Code Online (Sandbox Code Playgroud)

  • 你先生......是一个救生员.我真的很讨厌微软的文档...他们总是给出所有例子,除了最常用的例子 (12认同)

mes*_*tuk 5

你可以换个方式试试。它或多或少地做同样的事情。

UPDATE tablename 
SET    field1 = 'Test1', 
       field2 = 'Test2' 
WHERE  id = 1 

IF @@ROWCOUNT = 0 
  INSERT INTO tablename 
              (id, 
               field1, 
               field2) 
  VALUES      (1, 
               'Test1', 
               'Test2') 
Run Code Online (Sandbox Code Playgroud)