mysql - SQL Server 2005 执行 MySQL REPLACE INTO?

标签 mysql sql-server sql-server-2005

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

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

开始一个新事务,执行 Select() 然后 UPDATEINSERTCOMMIT 是总是有点痛苦,尤其是在应用程序中执行此操作时,因此始终保留 2 个版本的语句。

我想知道是否有一种简单且通用的方法可以在 SQL Server 2005 中实现这样的功能?

最佳答案

这让我对 MSSQL (rant on my blog) 感到恼火。我希望 MSSQL 支持 upsert

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

this post 上有更好的方法,基本上:

--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 操作,如果是插入,则将其减少到两个。

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 操作,但是代码很糟糕:-(

关于mysql - SQL Server 2005 执行 MySQL REPLACE INTO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/234/

相关文章:

php - Laravel 中如何使用 pluck 从其他表中获取特定数据?

sql-server - TSQL 使用序列插入表

sql-server-2005 - 确定如何在 SQL Server 中计算分割周

sql - 从表中选择每条记录,不重复相同的记录

MySQL 选择顺序不按日期排序

jquery - 为什么我的第二个下拉菜单没有被填充?

Javascript 事件监听器触发 php 代码,反之亦然?

sql-server - 如何更新链接服务器连接字符串?

sql - 自助加入获取员工经理姓名

sql - 如何从 SQL Server 2005 中的表中删除锁定?