【问题标题】:Delete all records Then what is left put into Temp table删除所有记录然后将剩下的放入临时表中
【发布时间】:2019-01-17 15:53:36
【问题描述】:

请指教。我有一个查询 (@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 的历史表中删除语句之后,应删除 p_no = 31817 的第二行,依此类推。第一行应该保留。

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

【问题讨论】:

  • 第二次查询后我不明白,如果是删除,为什么表中会有一些值?
  • 请澄清您所说的“在没有删除的内容之后留下的内容,并且可能没有删除的内容。”
  • 您的查询可能会在 23:59:59.001 之后丢失记录
  • 这完全太模糊了。请参阅 herehere 以改进此问题。
  • 如果您根据选择条件从 tableA 中删除,然后使用相同条件查询 TableA,并找到大量记录,则要么没有发生删除,要么选择发生在删除之前,或者在删除加载后,更多的记录被插入到 TableA

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


【解决方案1】:

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

为什么不这样做

@run_date

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

【讨论】:

  • 我会调整时间,但这不是这段代码的问题。某些东西仍然导致插入输入所有已删除的记录。
  • 简单明了,如果您从表中删除了行,则它们不可能插入到以下语句中,除非您在事务中有此操作并且正在使用 nolock、未提交读取或回滚事务在第二个语句之前。
  • @SeanLange 为混淆道歉,如果在这种情况下表不是临时表 T_history 并且行被删除。它们为什么会存在?为什么在以下语句中不提取现有行?这似乎是错误的,我会在我的代码中添加什么来解决这个问题? t_history 上的 nolock ?就是这样。
  • 这些行被删除后不可能存在。你的解释是不可能的。
  • @SeanLange 这就是我如此困惑和迷失的原因。这就是我在这里张贴票的原因。我不知道发生了什么以及为什么将数据插入到我的审计日志表中(如果它们不可能存在的话)。
猜你喜欢
  • 2020-02-28
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多