我一直在寻找这个问题的答案,但有些信息存在冲突或模棱两可,很难找到确定的答案。
我的背景:我正在使用“mssql”npm包中的node.js。我的SQL服务器是Microsoft SQL Server 2014。
我有一条记录可能已经存在于表中——如果存在,我想要更新它,否则我想要插入它。我不确定最佳的SQL是什么,或者是否应该在mssql中运行某种“事务”。我找到了一些看起来不错的选项,但我对它们都不确定:
选项1: 如何在存在时更新或插入
这个选项的问题是我甚至不确定这是否是MSSQL中的有效语法。虽然我喜欢它,而且它似乎也支持同时处理多行,这一点我很喜欢。
INSERT INTO table (id, user, date, points)
VALUES (1, 1, '2017-03-03', 25),
(2, 1, '2017-03-04', 25),
(3, 2, '2017-03-03', 100),
(4, 2, '2017-03-04', 150)
ON DUPLICATE KEY UPDATE points = VALUES(points)
选项2:
不知道这个选项是否存在问题,只是不确定它是否最优。似乎不支持多个同时的行。
update test set name='john' where id=3012
IF @@ROWCOUNT=0
insert into test(name) values('john');
选项 3:合并,https://dba.stackexchange.com/questions/89696/how-to-insert-or-update-using-single-query
有些人说这个方法有点问题?不过它显然支持同时多个操作,我很喜欢。
MERGE dbo.Test WITH (SERIALIZABLE) AS T
USING (VALUES (3012, 'john')) AS U (id, name)
ON U.id = T.id
WHEN MATCHED THEN
UPDATE SET T.name = U.name
WHEN NOT MATCHED THEN
INSERT (id, name)
VALUES (U.id, U.name);