我正在使用Microsoft Sql server 2014
我有一个请求,我必须检查ID是否存在,如果ID存在则更新。但是,客户希望从源中评估每个字段并检查目标是否有任何更改,如果有任何更改,则仅更新该字段,其余字段应为原始字段。
所以,如果我的原始请求是, 来源:
ID name company salary
1 dave ABC 50000$
2 ashley XXX 50000$
目标:
ID name company salary
1 dave ABC 50000$
2 ashley XXX 50000$
更新的请求: 来源:
ID name company salary
1 dave ABC 80000$
2 ashley XXX 80000$
现在我必须检查每一列以查看是否有任何更改,只有当任何列有任何更改时才更新该字段。
目标:
ID name company salary
1 dave ABC 80000$
2 ashley XXX 80000$
我不能使用hashkey / flag字段,因为我的目标表没有这些字段,我无法改变它们。 做这个的最好方式是什么? 任何帮助表示赞赏
答案 0 :(得分:0)
您可以构建一个dinamic更新查询服务器端测试该值,或者您可以使用内部联接和case语句的更新 如果您使用mysql,可以尝试这种方式
update target t
inner join source s on t.id = s.id
set case when t.name <> s.name then s.name else t.name end,
case when t.company <> s.company then s.company else t.company end,
case when t.salary <> s.salary then s.salary else t.salary end
答案 1 :(得分:0)
谢谢你们! 这个解决方案有效
MERGE testdb.dbo.targettable r
using dbo.sourcetable s
on s.id=r.id
WHEN MATCHED THEN
UPDATE
SET column1 = CASE WHEN r.column1 <> s.column1 THEN s.column1 ELSE r.column1 END,
column2 = CASE WHEN r.column2 <> s.column2 THEN s.column2 ELSE r.column2 END,
column3 = CASE WHEN r.column3 <> s.column3 THEN s.column3 ELSE r.column3 END,
column4 = CASE WHEN r.column4 <> s.column4 THEN s.column4 ELSE r.column4 END,
column5 = CASE WHEN r.column5 <> s.column5 THEN s.column5 ELSE r.column5 END,
column6 = CASE WHEN r.column6 <> s.column6 THEN s.column6 ELSE r.column6 END
.......;
我在查看是否有任何可以动态编写的查询,即动态检查是否有任何列需要从源更新到目标并更新目标表而不是检查每列。