删除所有记录然后将剩余的内容放入临时表

时间:2019-01-17 15:53:37

标签: sql sql-server sql-insert sql-delete

请告知。我有一个查询 (@variables是本地变量或传递的参数)。

    Delete  a
    From    T_HISTORY a
    JOIN    #tempb ON a.p_no = b.p_no
    Where   a.run_date 
    between Convert(datetime, Convert(varchar, @run_date, 101)) and Convert(datetime, Convert(varchar, @run_date, 101) + ' 23:59:59') 
    and     value_don= @value_don

然后我们有第二个查询-紧随其后

        select  a.*
        into    #test_delete
        From    T_HISTORY  a
        JOIN    #tempb b ON a.p_no = b.p_no
        Where   a.run_date 
        between Convert(datetime, Convert(varchar, @run_date, 101)) and Convert(datetime, Convert(varchar, @run_date, 101) + ' 23:59:59') 
        and     value_don= @value_don

希望是-取走临时表上连接的历史表中的所有内容,如果它们在运行日期(00:00 - 23:59:59)和value_don等于我们传递的参数之间,则将其删除。

删除未删除的内容后剩下的所有内容,并且可能未删除的内容。该数据应放入a #test_delete

然后读取下一行代码

    insert into LT_history_Audit_Log (  ... a bunch of columns ... )
    select      *
    From        #test_Delete
    Where       run_date between    Convert(datetime, Convert(varchar, @run_date, 101)) and Convert(datetime, Convert(varchar, @run_date, 101) + ' 23:59:59') 
    and         value_don= @value_don

因此,理论上应该发生的是,我们偶尔会有一行代码,也许有几行输入了audit_log表。

但是,我看到的是第一条语句中删除的每一行都输入到#test_delete表中。

历史记录表中的数据由基于不同参数和运行时间的值组成。临时表限制了我们从历史表中提取的内容。基于此条件,我们要删除这些记录。这意味着历史记录表中可能有未删除的内容。我们想要这些记录的记录。根据我们的数据,通常最多只有几行。

但是,当插入#test_delete时,它会插入上一条语句中删除的每一行。每行。因此,如果删除了140条记录(这是我们的平均值),则#test_delete有140条记录,然后将它们输入到审核表中。

时间不是这里的问题,但是我会解决的。

样本数据

t_history 
run_date                p_no  .... 
2019-01-10 10:44:47.910 31811 
2019-01-10 10:44:47.910 31817
...

#tempb 
p_no
31817
31818
31819

在历史记录表中针对运行日期1-10-19的delete语句之后,应删除第二行,其中p_no = 31817,依此类推。第一行应该保留。

但是在#test_delete中出现的是两行,其中id = 31817和31811。情况并非如此。好像删除语句从未发生过。

1 个答案:

答案 0 :(得分:0)

您的查询可能会丢失23:59:59.001之后的记录(取决于字段格式)

为什么不

@run_date <= a.run_date和a.run_date

我希望您所有名称中带有“ date”的对象都使用日期格式