Пожалуйста, сообщите. У меня есть запрос
(@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)
и значение_дона равно нашему переданному параметру.
Все, что осталось после того, что не было 'удалено, и, возможно, что-то не было. Эти данные должны быть сброшены в 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. Это не должно иметь место. Это как если бы оператор delete никогда не выполнялся.