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为空)。
有时在事务中的两个单独语句(UPDATE和INSERT您的情况)中执行操作更明确(和有效)。
此外,要知道有过(现在仍然是)一些问题MERGE。
| 归档时间: |
|
| 查看次数: |
37191 次 |
| 最近记录: |