Удалить все записи. То, что осталось, положить в таблицу Temp. - PullRequest
0 голосов
/ 17 января 2019

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

1 Ответ

0 голосов
/ 17 января 2019

ваш запрос может пропустить записи после 23: 59: 59.001 (в зависимости от формата поля)

почему бы не сделать

@ run_date <= a.run_date и a.run_date <dateadd (день, 1, @ run_date) </p>

Я надеюсь, что все ваши объекты с 'date' в имени используют форматы даты

...