我可以使用“ WAITFOR DELAY”执行一个过程吗

时间:2019-03-26 10:47:28

标签: tsql

我想知道是否可以在同一过程中执行一个过程。我不想使用触发器,所以我想做的是如果条件在10分钟后为false,则在循环中执行相同的过程。

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 个答案:

答案 0 :(得分: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