MySQL的SQL Server 2005实现REPLACE INTO?

MySQL有这个令人难以置信的有用的REPLACE INTO SQL命令。

这可以很容易地在SQL Server 2005中模拟?

开始一个新的事务,做一个Select()然后UPDATEINSERTCOMMIT总是有点痛苦,特别是当在应用程序中执行它,因此始终保持语句的两个版本。

我想知道是否有一个简单而通用的方法来实现这样的function到SQL Server 2005中?

这是让我恼火的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', ... ) 

如果是更新,则将其减less为一个IO操作,如果是插入,则减less两个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操作,但是可怕的代码:-(

您寻找的function传统上称为UPSERT。 至less知道它叫什么可能会帮助你find你要找的东西。

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

Merge在2005年的testing版本中可用,但在最终版本中将其删除。

什么upsert / merge正在做的事情的影响…

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

所以希望这些文章和这个伪代码的组合可以让事情移动。

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

底线是,如果你想廉价更新…和你想要安全的并发使用。 尝试:

 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个操作。 所以,如果你通常更新这是一个安全便宜的select。

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