Sql-Server
在合併中使用 Where 子句
在下面的語法中,
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
.