【发布时间】: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 之后丢失记录
-
如果您根据选择条件从 tableA 中删除,然后使用相同条件查询 TableA,并找到大量记录,则要么没有发生删除,要么选择发生在删除之前,或者在删除加载后,更多的记录被插入到 TableA
标签: sql sql-server sql-insert sql-delete