UPSERT多条记录MSSQL

时间:2017-02-27 21:09:26

标签: mysql sql-server merge upsert

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

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

REPLACE INTO tablename VALUES (A,B,C), (C,D,E), (F,G,H), (I,J,K)

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

我怀疑我能否有效地使用MERGE,因为批次中的某些记录会存在而且有些记录不会因为我事先并不知道表格的结构事实上,我正在更新2000个记录的批次,我不想出于性能原因使用子查询。

非常感谢任何有关最佳解决方案的帮助。

3 个答案:

答案 0 :(得分: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;

db<>fiddle demo

答案 1 :(得分:1)

看看这个。

Equivalent of MySQL ON DUPLICATE KEY UPDATE in Sql Server

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

答案 2 :(得分:0)

正如其他人指出的那样,这是MERGE的完美候选人。

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

let p = MTLRenderPipelineDescriptor()
...
p.colorAttachments[0].isBlendingEnabled = true
p.colorAttachments[0].rgbBlendOperation = .add
p.colorAttachments[0].alphaBlendOperation = .add
p.colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha
p.colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha
p.colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
p.colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha

这就是您需要做的。它很容易适应动态表,甚至临时表。表变量很棘手,但其他所有内容都很容易实现。