我需要执行如下所示的查询。列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)
在查询中。
答案 0 :(得分: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);
答案 1 :(得分:0)
尝试使用MERGE:
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 |