Могу ли я использовать «WAITFOR DELAY» для выполнения процедуры

#tsql

#tsql

Вопрос:

Мне интересно, возможно ли выполнить процедуру внутри той же процедуры. Я бы не хотел использовать триггер, поэтому я пытаюсь выполнить ту же процедуру в цикле, если условие ложно через 10 минут.

 use CF_BPS
go

create procedure p_Monitoring_HLR_statusy
as

if (
(select sum(uruchom_api) as sprawdzenie from ANALIZY..CC_LISTA_SMS_API
where priorytet=0 and cast(aud_data as date)=cast(getdate() as   
date))=0)    

begin

        insert into [CF_BPS].[dbo].[Monitoring_HLR_statusy]
        ([sp_id], [sp_numer], [tn_numer], [sms_api_check_date], [sms_api_phone], [sms_api_status])

        select [sp_id], [sp_numer], [telefon], [sms_api_check_date], [sms_api_phone], [sms_api_status] from ANALIZY..CC_LISTA_SMS_API
        where priorytet=0 and cast(aud_data as date)=cast(getdate() as date)

end

    else

begin

        waitfor delay '00:10:00.000'
        execute p_Monitoring_HLR_statusy

end
  

Вперед

Комментарии:

1. почему не задание, запланированное каждые 10 минут?

2. Но я не хочу, чтобы задание запускалось каждые 10 минут постоянно, я бы хотел остановить его, если условие истинно. Могу ли я сделать это с помощью задания?

3. да, если вы не хотите, чтобы задание запускалось снова, вы можете использовать sp_stop_job

4. Это то, что я хочу.

5. процедура sp_stop_job останавливает выполнение текущего задания, но это не меняет того факта, что задание будет запущено в соответствии с расписанием.

Ответ №1:

Чтобы избежать проблемы с рекурсией и просто сделать логику более прозрачной, я бы разбил это на две части. В SQL Agent это предельно просто. Вероятно, не намного сложнее в любом другом инструменте планирования.

Сначала попросите задание выполнить вашу процедуру. Однако вместо WAITFOR ELSE предложения THROW есть ошибка. (Обратите внимание на точку с запятой после BEGIN ; это требование для THROW .)

Затем настройте свой планировщик заданий на повторную попытку неудачного задания после 10-минутной задержки и установите ограничение на количество повторных попыток, чтобы вы случайно не попали в ситуацию, когда задание просто продолжает попытки, даже если ваши данные никогда не отображаются.

Пересмотренный процесс выглядит следующим образом:

 use CF_BPS
go

create procedure p_Monitoring_HLR_statusy
as

if (
(select sum(uruchom_api) as sprawdzenie from ANALIZY..CC_LISTA_SMS_API
where priorytet=0 and cast(aud_data as date)=cast(getdate() as   
date))=0)  

    begin;

      insert into [CF_BPS].[dbo].[Monitoring_HLR_statusy]
      ([sp_id], [sp_numer], [tn_numer], [sms_api_check_date], [sms_api_phone], [sms_api_status])

      select [sp_id], [sp_numer], [telefon], [sms_api_check_date], [sms_api_phone], [sms_api_status] from ANALIZY..CC_LISTA_SMS_API
      where priorytet=0 and cast(aud_data as date)=cast(getdate() as date);

    end

  else

    begin;

      THROW 51000, 'The data does not exist yet.', 1;

    end
  

Комментарии:

1. Я придерживаюсь мнения, что немного сбивает с толку то, что функция «Повторные попытки» находится ниже раздела «При успешном действии». Как эта функция должна работать?

2. Да, эта вкладка не очень интуитивно понятна. Однако после того, как вы настроите ее пару раз, ее легко запомнить. Просто выберите количество минут ожидания между повторными попытками (в вашем случае вы хотите десятиминутное ожидание), а затем выберите количество повторных попыток, которое вы хотите. Похоже, вы хотите, чтобы это было довольно большое число. Вот короткое сообщение в блоге с соответствующим снимком экрана: sqldbpool.com/2014/06/01 /…