Sql server 在T-SQL合并中在目标表中的字段之间移动数据

Sql server 在T-SQL合并中在目标表中的字段之间移动数据,sql-server,tsql,sql-server-2008,merge,sql-update,Sql Server,Tsql,Sql Server 2008,Merge,Sql Update,我有一个SQL MERGE语句,如果存在值,它将执行更新(如果存在,则执行INSERT)。我想在更新发生时记录行中最后几个“历史”值,有点像这样: MERGE into desttable as dest USING sourcetable as src on src.ref = dest.ref WHEN MATCHED THEN UPDATE SET dest.oldvalue3=dest.oldvalue2, dest.oldvalue2=dest.oldvalue1, dest.o

我有一个SQL MERGE语句,如果存在值,它将执行更新(如果存在,则执行INSERT)。我想在更新发生时记录行中最后几个“历史”值,有点像这样:

MERGE into desttable as dest
USING sourcetable as src
on src.ref = dest.ref

WHEN MATCHED THEN
UPDATE SET dest.oldvalue3=dest.oldvalue2, 
dest.oldvalue2=dest.oldvalue1, 
dest.oldvalue1=dest.value, 
dest.value=src.newvalue

WHEN NOT MATCHED THEN
INSERT ...

。。。因此,从本质上讲,现有的“value”被洗牌到“oldvalue1”,“oldvalue1”变成“oldvalue2”等等。然而,当我运行它时,每一列都被设置为“value”-UPDATE语句显然是一次设置所有字段。有什么方法可以实现我想要做的吗?

您可以在
using
子句中
左外连接desttable
,并使用
desttable
中的列作为更新的源

MERGE INTO desttable AS dest
USING (SELECT s.ref,
              s.newvalue,
              d.oldvalue2,
              d.oldvalue1,
              d.value 
       FROM sourcetable AS s
         LEFT OUTER JOIN desttable AS d
           ON s.ref = d.ref) AS src
ON src.ref = dest.ref
WHEN MATCHED THEN
UPDATE SET dest.oldvalue3=src.oldvalue2, 
           dest.oldvalue2=src.oldvalue1, 
           dest.oldvalue1=src.value, 
           dest.value=src.newvalue
;