我想知道是否可以在同一过程中执行一个过程。我不想使用触发器,所以我想做的是如果条件在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
去
答案 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