UPSERT多记录MSSQL

Vin*_*t L 2 mysql sql-server merge upsert

我目前有一个MySQL服务器,但目前正在迁移到MS SQL Server。

我试图在C#应用程序的表中每批插入很多(2000)或记录。我想复制MySQL的“ REPLACE INTO”(替换)(UPSERT),如果记录存在,我想更新它,如果记录不存在,我想插入它。我目前有一个这样的声明:

REPLACE INTO tablename (keycol, col1, col2)
VALUES ('A','B','C'),
       ('C','D','E'),
       ('F','G','H'),
       ('I','J','K');
Run Code Online (Sandbox Code Playgroud)

有些记录将存在,而另一些则不存在。另外,该语句将在许多不同的表上运行,并且值是在运行时构建的(通过动态循环遍历每个字段),因此在编译时表的结构未知。

我怀疑我是否可以有效地使用MERGE,因为该批次中的某些记录将存在而一些记录将不存在,并且由于我不知道事前的表格结构以及我正在更新批次的事实。 2000条记录,出于性能原因,我不想使用子查询。

最好的解决方案的任何帮助将不胜感激。

Luk*_*zda 5

MERGE 专为以下情况而设计:

CREATE TABLE tablename(keycol CHAR(1) PRIMARY KEY, col1 CHAR(1), col2 CHAR(1));
INSERT INTO tablename(keycol, col1, col2) VALUES('A', 'X', 'X'); -- to be updated
SELECT * FROM tablename;

MERGE tablename trg
USING (VALUES ('A','B','C'),
              ('C','D','E'),
              ('F','G','H'),
              ('I','J','K')) src(keycol, col1, col2)
  ON trg.keycol = src.keycol
WHEN MATCHED THEN
   UPDATE SET col1 = src.col1, col2 = src.col2
WHEN NOT MATCHED THEN
   INSERT(keycol, col1, col2)
   VALUES(src.keycol, src.col1, src.col2);

SELECT * FROM tablename;
Run Code Online (Sandbox Code Playgroud)

db <> fiddle演示


Nie*_*ves 1

看看这个。

Sql Server 中的 MySQL ON DUPLICATE KEY UPDATE 等效项

我认为这会解决你的问题。