如何在Sql Server 2008中的一个MERGE查询中更新,插入,删除?

时间:2014-05-30 01:03:45

标签: sql sql-server-2008 merge

我有两张桌子 - 来源和目的地。我想使用MERGE查询(SQL Server 2008)将源合并到目标。

我的设置如下:

  1. 每个目标记录有三个字段(在实际应用程序中,当然有3个以上) - id,校验和和时间戳。
  2. 每个源记录都有两个字段 - id和checksum。
  3. 如果没有具有相同ID的目标记录,则将源记录插入目标。
  4. 如果源记录校验和为IS NOT NULL,则将使用相同的id从源记录更新目标记录。如果校验和不是NULL,则保证它与相应的目标校验和不同。这是给定的。
  5. 如果没有具有相同ID的源记录,将删除目标记录。
  6. 这个设置应该很好地适用于MERGE语句语义,但我无法实现它。

    我的不良尝试记录在此SQL Fiddle

    我做错了什么?

    修改

    BTW,而不是基于MERGE的解决方案是here

1 个答案:

答案 0 :(得分:5)

create table #Destination
(
    id          int,
    [Checksum]  int,
    [Timestamp] datetime
)
create table #Source
(
    id         int,
    [Checksum] int
)

insert #Destination
values (1, 1, '1/1/2001'),
       (2, 2, '2/2/2002'),
       (3, 3, getdate()),
       (4, 4, '4/4/2044')
insert #Source
values (1, 11),
       (2, NULL),
       (4, 44);

merge #destination as D
using #Source as S
on (D.id = S.id)
when not matched by Target then
    Insert (id, [Checksum], [Timestamp])
    Values (s.id, s.[Checksum], Getdate())
when matched and S.[Checksum] is not null then
    Update
    set D.[Checksum]=S.[Checksum],
        D.[Timestamp]=Getdate()
when not matched by Source then
    Delete
    Output $action, inserted.*,deleted.*;

select *
from #Destination