Как избежать параллельного выполнения в хранимой процедуре - PullRequest
0 голосов
/ 17 мая 2019

У меня есть хранимая процедура, которая должна обрабатывать данные за определенный день и заполнять таблицу истории. Но если данные за этот день уже обработаны, т. Е. Если в таблице истории есть какая-то отдельная строка на эту определенную дату, она должна прерваться:

SET XACT_ABORT ON;
IF EXISTS (
  select *
  from history_table
  where convert(date, call_time) = @date_to_process
) 
THROW 50000, N'This day has already been processed. Exiting!', 1;

// process the data ... 

// fill the history table 
insert into history_table (call_time, other_data)
select call_time, other_data
from #processed_data;

Иногда, когда я вызываю SP с @date_to_process, который определенно не был обработан ранее, я все равно получаю ошибку " Этот день уже обработан. Выход! ". Но когда я смотрю на таблицу истории, я вижу, что оператор вставки действительно выполнялся. Я сомневаюсь, что эти два заявления работают последовательно. Похоже, оператор INSERT завершает до проверки существования.

Как я могу убедиться, что они работают последовательно?

1 Ответ

0 голосов
/ 17 мая 2019

Похоже, вам просто нужно использовать ELSE, чтобы выполнялся только один оператор:

SET XACT_ABORT ON;

IF EXISTS (select null
           from history_table
           where convert(date, call_time) = @date_to_process
          )
    THROW 50000, N'This day has already been processed. Exiting!', 1;

ELSE // fill the history table 
    insert into history_table (call_time, other_data)
    select call_time, other_data
    from #processed_data;
...