MySQL有这个非常有用但有用的REPLACE INTO SQL命令。

这可以在SQL Server 2005中轻松模拟吗?

启动一个新的Transaction,执行Select()然后UPDATEINSERTCOMMIT总是有点痛苦,特别是在应用程序中执行它时因此总是保留2个版本的语句。

我想知道是否有一种简单而通用的方法将这样的功能实现到SQL Server 2005中?

===============>>#1 票数:58 已采纳

这让我对MSSQL感到恼火( 在我的博客上咆哮 )。 我希望MSSQL支持upsert

@ Dillie-O的代码是旧版SQL版本的一个好方法(+1票),但它仍然基本上是两个IO操作( exists然后updateinsert

这篇文章有一个更好的方法,基本上:

--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

如果是更新,则将其减少为一个IO操作,如果是插入,则将其减少为两个IO操作。

MS Sql2008引入了SQL:2003标准的merge

merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

现在它真的只是一个IO操作,但可怕的代码:-(

===============>>#2 票数:21

您正在寻找的功能传统上称为UPSERT。 Atleast知道它叫什么可能会帮助你找到你想要的东西。

我不认为SQL Server 2005有任何好方法。 2008年引入了可用于实现此目的的MERGE语句,如下所示: http//www.databasejournal.com/features/mssql/article.php/3739131http://blogs.conchango.com/davidportas/archive/一十一分之二千零七/ 14 / SQL-Server的2008 MERGE.aspx

Merge在2005年的测试版中可用,但是他们在最终版本中删除了它。

===============>>#3 票数:17

upsert / merge正在做什么是...的效果

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT INTO [Table]

所以希望这些文章和这些伪代码的组合可以让事情发生变化。

===============>>#4 票数:10

我写了一篇关于这个问题博客文章

最重要的是,如果您想要便宜的更新......并且您希望安全地进行并发使用。 尝试:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

这样,您可以进行1次更新操作,最多可以进行3次插入操作。 所以,如果你一般更新这是一个安全便宜的选择。

我也会非常小心,不要使用任何对于并发使用不安全的东西。 它很容易在生产中获得主键违规或重复行。

  ask by Michael Stum translate from so

未解决问题?本站智能推荐: