Sql-Server

在合併中使用 Where 子句

  • June 9, 2020

在下面的語法中,When Matched是否可以僅在更新表中的值與僱員表中的值不同時才進行更新?類似於我下面的 DDL 的東西 - 但當然這會引發錯誤並且不起作用。

我應該在我的語法中更新什麼以僅更新不同的行?我想要的更新是不迭代匹配的每一行,而只更新,emp44 & emp55因為地址不同。

出現的錯誤是

消息 156,級別 15,狀態 1,第 24 行

關鍵字“WHERE”附近的語法不正確。

句法

 DECLARE @Emp Table (empid varchar(10), empaddress varchar(100))
 Insert Into @Emp Values 
 ('emp11', '111 No Blue'), 
 ('emp22', '222 No Blue'),
 ('emp33', '333 No Blue'), 
 ('emp44', '444 No Blue'),
 ('emp55', '555 No Blue');

Declare @EmpUpdates TABLE (empid varchar(10), empaddress varchar(100))
Insert Into @EmpUpdates Values
('emp11', '111 No Blue'), 
('emp22', '222 No Blue'),
('emp33', '333 No Blue'), 
('emp44', '999 No Blue'),
('emp55', '888 No Blue'),
('emp66', '4141 No Blue');

MERGE @Emp emp
Using @EmpUpdates eup
ON emp.empid = eup.empid
WHEN MATCHED THEN
UPDATE
SET emp.empaddress = eup.empaddress
WHERE emp.empaddress <> eup.empaddress
WHEN NOT MATCHED BY TARGET THEN
INSERT (empid, empaddress)
VALUES(eup.empid, eup.empaddress)

WHERE聲明的那部分沒有MERGE。請參閱MERGE (Transact-SQL)文件以獲取語法幫助。

子句中有一個可選AND部分,WHEN MATCHED因此直接的答案是將條件移到那裡:

MERGE @Emp emp
USING @EmpUpdates eup
ON emp.empid = eup.empid
WHEN MATCHED 
    AND emp.empaddress <> eup.empaddress
 THEN
   UPDATE
   SET emp.empaddress = eup.empaddress
WHEN NOT MATCHED BY TARGET 
 THEN 
   INSERT (empid, empaddress)
   VALUES (eup.empid, eup.empaddress) ;

小心在那裡正確處理空值(如果empaddress可以為空)。

UPDATE在事務中的兩個單獨的語句(INSERT在您的情況下)中執行操作有時更明確(和有效) 。

此外,請注意MERGE.

引用自:https://dba.stackexchange.com/questions/154509