当作业停止时,来自代理作业的存储过程调用的状态

时间:2015-01-19 06:37:47

标签: sql-server tsql sql-agent-job

我们有一个清理工作,它调用存储过程,而后者又会删除一天的日志记录。这项工作每五分钟运行一次,通常在不到10秒的时间内完成。有时,需要更长的时间,长达15分钟。在这种情况下,日志表会被锁定,后续事务会超时,直到作业完成。

为了解决这个问题,我们提出了这个解决方案 -

1)删除现有作业的日程安排

2)创建一个新作业,以调用原始作业

3)安排新工作每5分钟运行一次

4)见下面的新工作代码

    DECLARE @JobToRun NVARCHAR(128) = N'OM_EDU_Purge logs'    
    EXEC msdb.dbo.sp_start_job @JobToRun
    WAITFOR DELAY '00:00:20'
        IF EXISTS(SELECT 1 
                  FROM msdb.dbo.sysjobs J 
                  JOIN msdb.dbo.sysjobactivity A 
                        ON A.job_id=J.job_id 
                  WHERE J.name=@JobToRun 
                        AND A.run_requested_date IS NOT NULL 
                        AND A.stop_execution_date IS NULL
                )
            BEGIN -- job is running or finishing (not idle)
                EXEC msdb.dbo.sp_stop_job @job_name=@JobToRun                   
                -- could log info, raise error, send email etc here
            END

这似乎工作正常,如果它在20秒后仍在运行,则停止工作。但是,由于作业调用存储过程,这是我的问题:

当作业停止时,它是否还会终止正在执行的存储过程?

2 个答案:

答案 0 :(得分:0)

我认为您的查询会被卡住,因为正在更新日志表或与您删除语句同时创建记录。因此,您可能会尝试在删除语句执行时锁定表。更新您在查询中的过程,如exp:delete from logs with(tablock)

答案 1 :(得分:0)

这里,存储过程只是调用另一个嵌套的存储过程。所以不,存储过程不会被停止。控件将返回调用存储过程。您应该在proc中有足够的错误处理来处理被调用的sproc错误的情况。