SQLServer 是否提供类似 MySQL 的

在 MySQL 中,如果指定了 关于重复密钥更新并插入了一行,该行将导致 UNIQUE 索引或 PRIMARYKEY 中出现重复值,则将执行旧行的 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;

我相信我在 T-SQL 中没有遇到过类似的东西。SQLServer 是否提供了任何可与 MySQL 的 ON DUPLICATEKEY 更新相媲美的东西?

82993 次浏览

没有重复的密钥更新等价物,但合并和当匹配可能会为您工作

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

作为 TSQL 的一部分,SQLServer2008具有此特性。
点击这里查看 MERGE 声明的相关文档-http://msdn.microsoft.com/en-us/library/bb510625.aspx”rel = “ nofollow norefrer”> http://msdn.microsoft.com/en-us/library/bb510625.aspx

SQL server 2000以后的版本有一个替代触发器的概念,它可以实现想要的功能——尽管在幕后隐藏着一个讨厌的触发器。

检查“插入还是更新?”部分

Http://msdn.microsoft.com/en-us/library/aa224818(sql.80).aspx

令我惊讶的是,这个页面上的所有答案都没有包含一个实际的查询示例,所以这里是:

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

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');

你可以反过来试试,它或多或少有同样的作用。

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


IF @@ROWCOUNT = 0
INSERT INTO tablename
(id,
field1,
field2)
VALUES      (1,
'Test1',
'Test2')