等效于SQL Server中的MySQL ON DUPLICATE KEY UPDATE [英] Equivalent of MySQL ON DUPLICATE KEY UPDATE in Sql Server

查看:231
本文介绍了等效于SQL Server中的MySQL ON DUPLICATE KEY UPDATE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Sql Server(2012)中找到以下MySql查询的等效项?

INSERT INTO mytable (COL_A, COL_B, COL_C, COL_D)
VALUES ( 'VAL_A','VAL_B', 'VAL_C', 'VAL_D')
ON DUPLICATE KEY UPDATE COL_D= VALUES(COL_D);

任何人都可以帮忙吗?

PS.我已经阅读到MERGE查询具有相似的功能,但是我发现该语法非常不同.

解决方案

您基本上是在寻找插入或更新模式,有时也称为 Upsert.

我建议这样做:为Sql Server插入或更新模式-山姆藏红花

对于将要处理单行的过程,这些事务都将运行良好:

Sam Saffron的第一个解决方案(适用于此架构):

 begin tran
if exists (
  select * 
    from mytable with (updlock,serializable) 
    where col_a = @val_a
      and col_b = @val_b
      and col_c = @val_c
  )
  begin
    update mytable
      set col_d = @val_d
      where col_a = @val_a
        and col_b = @val_b
        and col_c = @val_c;
  end
else
  begin
    insert into mytable (col_a, col_b, col_c, col_d)
      values (@val_a, @val_b, @val_c, @val_d);
  end
commit tran
 

Sam Saffron的第二个解决方案(适用于此架构):

 begin tran
  update mytable with (serializable)
    set col_d = @val_d
      where col_a = @val_a
        and col_b = @val_b
        and col_c = @val_c;
  if @@rowcount = 0
    begin
        insert into mytable (col_a, col_b, col_c, col_d)
          values (@val_a, @val_b, @val_c, @val_d);
     end
commit tran
 


即使创造性地使用 IGNORE_DUP_KEY ,您仍然不得不使用插入/更新块或合并语句.

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆