将 Where 子句与 Merge 一起使用

Sma*_*uys 14 sql-server t-sql sql-server-2008-r2 merge

在下面的语法中,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)
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 29

声明的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) ;
Run Code Online (Sandbox Code Playgroud)

小心在那里正确处理空值(如果可以empaddress为空)。

有时在事务中的两个单独语句(UPDATEINSERT您的情况)中执行操作更明确(和有效)。

此外,要知道有过(现在仍然是)一些问题MERGE