gpt4 book ai didi

mysql - UPSERT 多条记录 MSSQL

转载 作者:行者123 更新时间:2023-11-29 01:20:05 26 4
gpt4 key购买 nike

我目前有一个 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');

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

我怀疑我能否有效地使用 MERGE,因为批处理中的一些记录将存在而一些不会存在,而且因为我事先不知道表的结构以及我是更新 2000 条记录的批处理,出于性能原因我不想使用子查询。

如能提供最佳解决方案,我们将不胜感激。

最佳答案

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;

db<>fiddle demo

关于mysql - UPSERT 多条记录 MSSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42495823/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com