Sql server 使用If/Else语句将新记录插入表中

Sql server 使用If/Else语句将新记录插入表中,sql-server,tsql,sql-update,sql-insert,Sql Server,Tsql,Sql Update,Sql Insert,我有两个SQL Server表,需要将记录从一个表添加到下一个表。如果目标表中已经存在唯一标识符,则将记录更新为来自源表的数据-如果唯一标识符不存在,则将整个新记录插入目标表 在我更新目标表中的记录的地方,我似乎已经让最初的部分开始工作了,但我将插入新记录的部分似乎不起作用 if exists ( select 1 from SCM_Top_Up_Operational O join SCM_Top_Up_Rolling R ON O.String = R.string ) b

我有两个SQL Server表,需要将记录从一个表添加到下一个表。如果目标表中已经存在唯一标识符,则将记录更新为来自源表的数据-如果唯一标识符不存在,则将整个新记录插入目标表

在我更新目标表中的记录的地方,我似乎已经让最初的部分开始工作了,但我将插入新记录的部分似乎不起作用

if exists (
   select 1
   from SCM_Top_Up_Operational O
   join SCM_Top_Up_Rolling R ON O.String = R.string
)
begin

   update O
   set    O.Date_Added = R.Date_Added,
          O.Real_Exfact = R.Real_Exfact,
          O.Excess_Top_Up = R.Excess_Top_Up 
   from  SCM_Top_Up_Operational O 
   join  SCM_Top_Up_Rolling R on O.String = R.String
   where O.String = R.string and R.date_added > O.date_added

end

else 

begin
   insert into SCM_Top_Up_Operational (String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant)
   select String,Date_Added,Real_Exfact,Article_ID,Excess_Top_Up,Plant
   from SCM_Top_Up_Rolling
end

如果我没有记错的话,您应该能够使用自SQLServer2008以来提供的一个SQL查询来解决这个问题

从文件中:

根据与源表的联接结果对目标表运行插入、更新或删除操作。例如,通过基于在另一个表中发现的差异插入、更新或删除一个表中的行来同步两个表

考虑以下查询:

MERGE 
    SCM_Top_Up_Operational O 
    USING SCM_Top_Up_Rolling R ON (O.String = R.string)
WHEN MATCHED 
    THEN UPDATE SET 
        O.Date_Added    = R.Date_Added,
        O.Real_Exfact   = R.Real_Exfact,
        O.Excess_Top_Up = R.Excess_Top_Up 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (  String,   Date_Added,   Real_Exfact,   Article_ID,   Excess_Top_Up,   Plant)
         VALUES (R.String, R.Date_Added, R.Real_Exfact, R.Article_ID, R.Excess_Top_Up, R.Plant)

漂亮的。我每天都在SQL中工作,甚至不知道这是一件事,因为我所使用的db是从2008年以前就开始滚动的。我认为这就是答案,但我得到了一个错误,需要改进ON子句,因为“MERGE语句多次尝试更新或删除同一记录”我确实在源表中有两个相同字符串的实例,这是故意的——目的是用该字符串记录的最新实例更新目标表。这是MERGE能处理的吗?我要说的是,源表是由一个记录ID进行键控的,该记录ID是表上唯一的唯一标识符。再次感谢。