SQL Server 2008 MERGE与Target作为没有值的表

时间:2012-01-27 15:57:16

标签: sql sql-server-2008 merge

我想从源到目标进行MERGE,如果它们不存在则插入行,并更新那些行。当我这样做时,我只获得插入...没有更新。我读过这篇文章(http://stackoverflow.com/questions/5015623/merge-query-in-sql-server-2008),这对我来说有点令人困惑,但似乎我需要一个重复的来源让这件事成真。有人可以解释为什么需要DUPLICATE源吗?我只是不明白,特别是我应该使用哪些密钥(重复源或常规密钥) - 也许不需要重复的SourceTable?

这里我的(简化)SourceTable:

   row   userid   placervalue   placerDt
   ---   -------  ----------    ----------
   1     abc      a1            1/1/12
   2     xyz      b1            1/1/12
   3     abc      b2            1/20/12
   etc.

和我的目标TargetTable相同,但目前没有行。

   row   userid   placerId   
   ---   -------  ----------
  (nothing loaded yet)

我想要的是INSERT不在目标中的行和UPDATE行。

   row   userid   placervalue   placerDt
   ---   -------  ----------    ----------
   1     abc      a1            1/20/12  *** note change here (row 3 updates row 1)
   2     xyz      b1            1/1/12

当我运行此代码时,我只获得插入(也想知道原因)

MERGE TargetTable as t
USING SourceTable as s
   ON s.userid = t.usrid AND s.placervalue = t.placervalue
WHEN MATCHED THEN
   UPDATE
      SET t.placerDt = s.placerDt
WHEN NOT MATCHED THEN
   INSERT (
       userid
     , placerid
     , placerDt
   ) VALUES (
       s.userid
     , s.placerid
     , s.placerDt
   );

1 个答案:

答案 0 :(得分:1)

如果您的目标表上没有行,则没有任何匹配,这就是您只能获得插入的原因。

第二次运行查询,您应该有更新