2014-11-25 49 views
2

我需要執行一個查詢,如下所示。列KEY1和KEY2是不能重複的鍵。如果有鍵匹配,我需要執行更新VAL而不是插入。我怎麼能在SQL Server中做到這一點?在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) 
查詢

+1

MERGE支持多行。爲什麼不呢? – 2014-11-25 11:00:00

+0

你是不是想'批量插入/ Update' – Rajesh 2014-11-25 11:08:24

+0

我試過'WHEN NOT然後再配 INSERT(KEY1,KEY2,VAL) VALUES( 'datakeyA1', 'datakeyA1', 'datakeyA1'),( 'datakeyB1',「datakeyB1 ','datakeyB1');'。這似乎是一個無效的語法。 – devnull 2014-11-25 11:10:22

回答

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); 
+0

我正在尋找解決方案來更新單個查詢中的多個行,就像INSERT INTO MyTable(a,b,c)VALUES(1,2,3), (3,4,5), ,這真的這樣做。謝謝 – Jacopo 2016-08-06 20:54:07

0

嘗試使用合併這樣的:

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 |