在 Sql Server 中插入或更新多行

Posted

技术标签:

【中文标题】在 Sql Server 中插入或更新多行【英文标题】:Insert or Update multiple rows in Sql Server 【发布时间】:2014-11-25 10:58:43 【问题描述】:

我需要执行如下所示的查询。 KEY1 和 KEY2 列是不能重复的键。如果有键匹配,我需要执行更新 VAL 而不是插入。如何在 Sql Server 中做到这一点?

INSERT INTO tableA
  ( 
      KEY1,
      KEY2,
      VAL,                      
  ) VALUES (
          -- Row A
          'datakeyA1',
          'datakeyA2',
          'somevaluetoinsertorupdate'
      ) , (
          -- Row B
          'datakeyB1',
          'datakeyB2',
          'somevaluetoinsertorupdate'
      ) , (
          -- Row C
          'datakeyC1',
          'datakeyC2',
          'somevaluetoinsertorupdate'
      );

我尝试使用 MERGE,但查看语法,我不确定它是否支持更新/插入多行。如果有人过去遇到过类似的情况,请您帮忙吗?

编辑:

如果我使用的是 mysql,我会使用:

ON DUPLICATE KEY UPDATE 
 VAL = VALUES(VAL)

在查询中。

【问题讨论】:

MERGE 支持多行。为什么不呢? 你在尝试Bulk insert / Update 我试过WHEN NOT MATCHED THEN INSERT (KEY1,KEY2,VAL) VALUES ('datakeyA1', 'datakeyA1', 'datakeyA1'), ('datakeyB1', 'datakeyB1', 'datakeyB1');。这似乎是一个无效的语法。 我正在尝试插入多行,但正在研究在现有数据中找到匹配键时如何进行更新而不是插入。 (即与 MySql 中的 ON DUPLICATE KEY UPDATE 功能相同 【参考方案1】:

您可以使用table value constructor 作为源表,以使其与MERGE 一起工作:

MERGE tableA AS t
USING (VALUES 
        ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate'), 
        ('datakeyB1', 'datakeyB2', 'somevaluetoinsertorupdate'),
        ('datakeyC1', 'datakeyC2', 'somevaluetoinsertorupdate')
    ) AS s (Key1, Key2, Val)
        ON s.Key1 = t.Key1
        AND s.Key2 = t.Key2
WHEN MATCHED THEN 
    UPDATE 
    SET    Val = s.Val
WHEN NOT MATCHED THEN 
    INSERT (Key1, Key2, Val)
    VALUES (s.Key1, s.Key2, s.Val);

【讨论】:

我正在寻找在单个查询中更新多行的解决方案,就像 INSERT INTO MyTable (a,b,c) VALUES (1,2,3),(3,4, 5),[...] 这确实做到了。谢谢【参考方案2】:

尝试像这样使用 MERGE:

SQL Fiddle

MS SQL Server 2008 架构设置

CREATE TABLE tableA
(
    KEY1 VARCHAR(50),
    KEY2 VARCHAR(50),
    VAL VARCHAR(50)
    PRIMARY KEY (Key1, Key2)         
) 

INSERT INTO tableA
VALUES ('datakeyA1', 'datakeyA2', 'somevaluetoinsertorupdate')

查询 1

MERGE  tableA AS T
USING
    (VALUES ('datakeyA1','datakeyA2','SOME NEW VALUE'), 
            ('datakeyB1','datakeyB2','somevaluetoinsertorupdate'), 
            ('datakeyC1','datakeyC2','somevaluetoinsertorupdate')) AS S(Key1, Key2, Val) 
ON (S.Key1 = T.Key1 AND S.Key2 = T.Key2)
WHEN MATCHED
    THEN UPDATE SET T.Val = S.Val
WHEN NOT MATCHED BY TARGET
    THEN INSERT (Key1, Key2, VAL) VALUES (S.Key1, S.Key2, S.Val);

SELECT *
FROM tableA

Results

|      KEY1 |      KEY2 |                       VAL |
|-----------|-----------|---------------------------|
| datakeyA1 | datakeyA2 |            SOME NEW VALUE |
| datakeyB1 | datakeyB2 | somevaluetoinsertorupdate |
| datakeyC1 | datakeyC2 | somevaluetoinsertorupdate |

【讨论】:

以上是关于在 Sql Server 中插入或更新多行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中插入多行?

如何使用 SQL Server 中的存储过程在单个查询中插入多行

如何在 SQL Server CE 数据库中插入多行? [关闭]

SQL Server 插入多行并增加一个 int 列

sql server“键列信息不足或不正确。更新影响到多行”

SQL:如果存在则更新,否则插入...但对于具有不同值的多行