首页 > 解决方案 > 使用最新数据更新表而不删除和复制

问题描述

我有一个存储过程,每 2 小时在填充表的作业代理上执行一次。存储过程删除表中的所有内容,然后重新插入所有内容。这对使用此表的任何报告都是有害的,因为在作业代理执行期间,短时间内没有数据。

我需要做的只是让 sp 将最新的行插入到表中,而不进行任何删除并且不复制所有内容。

我要插入的表格类似于下面。

 unique        CALL_TIME         ACTUAL_STOP       CAR
   1           10:40                 A             B2
   1           10:42                 C             C3
   2           15:40                 NULL          B2
   3           15:45                 A             E5
   3           15:45                 A             E6
   3           15:45                 A             E1

这是我试过的

 CREATE TABLE #tempSP

            (
        [Unique] [varchar](20),
        [CALL_TIME] [datetime] ,
        [ACTUAL_STOP] [varchar](10),
                    
                    [CAR] [varchar] (5)


            )

 INSERT INTO #tempSP

  SELECT 
  [Unique],
  [CALL_TIME],
  [ACTUAL_STOP],

  [CAR]

  FROM Table


 select * from #tempSP as s

 where   Not exists  

 ( 

 select * from [dbo].[test_table] as tt
 where s.unique = tt.unique

输出类似于下面的内容,您可以看到添加了一行,这很棒,这就是我想要的。但 'Unique 2' 的 ACTUAL_STOP 仍然为 NULL。该字段通常是我们系统中最后填充的内容,因此它暂时为 NULL 并不罕见,但是一旦填充它就永远不会使用此方法更新。

   unique      CALL_TIME         ACTUAL_STOP       CAR
   1           10:40                 A             B2
   1           10:42                 C             C3
   2           15:40                 NULL          B2
   3           15:45                 A             E5
   3           15:45                 A             E6
   3           15:45                 A             E1
   4           09:10                 B             B2

MERGE我也试过了,这个方法和上面一样,还是有没有更新ACTUAL_STOP字段的问题。

  CREATE TABLE #tempSP

            (
        [Unique] [varchar](20),
        [CALL_TIME] [datetime] ,
        [ACTUAL_STOP] [varchar](10),

                    [CAR] [varchar] (5) 

            )

 INSERT INTO #tempSP

  SELECT 
  [Unique],
  [CALL_TIME],
  [ACTUAL_STOP],

  [CAR] 

  FROM Table


 select * from #tempSP as s

MERGE [dbo].[test_table] as d

USING #tempSP as s

ON (d.unique = s.unique)

WHEN MATCHED AND d.unique = s.unique

WHEN NOT MATCHED THEN INSERT ([unique], [CALL_TIME], [ACTUAL_STOP], [CAR])
                       VALUES(s.[unique],s.[CALL_TIME], s.[ACTUAL_STOP], s.[CAR])

还添加了更新集

   CREATE TABLE #tempSP

            (
        [Unique] [varchar](20),
        [CALL_TIME] [datetime] ,
        [ACTUAL_STOP] [varchar](10) ,

                    [CAR] [varchar] (5)

            )

 INSERT INTO #tempSP

  SELECT 
  [Unique],
  [CALL_TIME],
  [ACTUAL_STOP],

  [CAR]

  FROM Table


 select * from #tempSP as s

MERGE [dbo].[test_table] as d

USING #tempSP as s

ON (d.unique = s.unique)

WHEN MATCHED AND d.unique = s.unique

THEN UPDATE SET d.unique = s.unique, d.[CALL_TIME] = s.{CALL_TIME], d.[ACTUAL_STOP] = s.[ACTUAL_STOP], d.[CAR] = s.[CAR]

WHEN NOT MATCHED THEN INSERT ([unique], [CALL_TIME], [ACTUAL_STOP], [CAR])
                       VALUES(s.[unique],s.[CALL_TIME], s.[ACTUAL_STOP], s.[CAR])

这给出了错误'A MERGE 语句不能多次更新/删除目标表的同一行。优化 ON 子句以确保目标行最多匹配一个源行,或使用 GROUP BY 子句对源行进行分组。

标签: sqlsql-servertsql

解决方案


推荐阅读