Mysql 向上插入多条记录MSSQL

Mysql 向上插入多条记录MSSQL,mysql,sql-server,merge,upsert,Mysql,Sql Server,Merge,Upsert,我目前有一台MySQL服务器,但我目前正在迁移到MS SQL server 我试图在C应用程序的表中插入2000个批次或每个批次的记录。我想将MySQL的REPLACE复制到UPSERT中,如果记录存在,我想更新它,如果不存在,我想插入它。我现在有这样一种说法: REPLACE INTO tablename (keycol, col1, col2) VALUES ('A','B','C'), ('C','D','E'), ('F','G','H'), (

我目前有一台MySQL服务器,但我目前正在迁移到MS SQL server

我试图在C应用程序的表中插入2000个批次或每个批次的记录。我想将MySQL的REPLACE复制到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;
正如其他人所指出的,这是合并的完美候选

这里有一个例子。在本例中,Sourcetable和Tablename具有相同的布局,但只要您知道匹配列名和数据列名,这将起作用


这就是你需要做的一切。它很容易适应动态表甚至临时表。表变量很棘手,但其他一切都很容易完成。

如何检查它们是否存在唯一ID?。合并就是为了做到这一点。。。2000张唱片不是很多。。。您可以将整个批次批量写入暂存表并使用更新。。。哪里有。。。并插入。。。不存在的地方。。。一下子。但是-老实说-MERGE的作用大致相同…基本上,我的C应用程序在一个字符串中构建一个查询,我可以在其中附加值:REPLACE到tablename值a、B、C、C、D、E、F、G、H、I、J、K如果我使用MERGE,它将如下所示:匹配时合并tablename,然后更新。。。。如果不匹配,则插入A、B、C、D、E、F、G、H、I、J、K。我不知道如何完成UPDATE子句以覆盖此记录中与主键匹配的每一列。如前所述:MERGE正是为此类作业设计的。在大多数情况下,人们宁愿对某种类型的表使用SELECT,而不是值元组列表,但这不是重点。阅读有关大容量插入的内容,它几乎可以立即工作,然后使用“合并”执行UPSERT。大容量插入不是从文件加载数据吗?这不是我现在正在做的。我试图做的是从表a中读取记录,修改一些字段并将这些数据放在表B中。要放到上下文中,表a有一个时间戳,表B有一个移动平均值,其时间间隔与表a中的时间间隔不同。表A每日更新。但由于表B是一个移动平均值,当我第二天再次运行它时,最后几条记录可能需要更新,因为我现在在表a中有了新数据。因此主键将存在,我想改写这些记录。如果您可以针对唯一的主键合并进行测试,则应该是正确的选择…使用此选项,但是,我必须指定要更新的所有列。正当是否存在重复密钥更新整个记录的情况?此外,由于每个批处理有2000条记录,因此我不希望字符串重复相同的2000个值集两次。i、 e:在tablename中插入值A、B、C、D、e、F。。。在重复键更新tablename值A、B、C、D、E、F、…@VincentL时-其结尾是。。。更新colA=VALUEScolA,colB=VALUEScolB。。。您不会重复这些值,而是将每个列名重复两次。
MERGE TableName AS TARGET
USING SourceTable AS SOURCE 
ON (TARGET.Keycol = SOURCE.Keycol) 
WHEN MATCHED 
AND 
(
    TARGET.Col1 != SOURCE.Col1 OR TARGET.Col2 != SOURCE.Col2
) 
THEN 
UPDATE 
SET 
    TARGET.Col1 = SOURCE.Col1
    , TARGET.col2 = SOURCE.Col2 
WHEN NOT MATCHED BY TARGET 
THEN INSERT (keycol,col1,col2) VALUES (SOURCE.KeyCol, SOURCE.Col1, SOURCE.Col2)
;