Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL代理:设置最大执行时间_Sql Server_Sql Server Agent - Fatal编程技术网

Sql server SQL代理:设置最大执行时间

Sql server SQL代理:设置最大执行时间,sql-server,sql-server-agent,Sql Server,Sql Server Agent,下午好。我有几个SQL代理作业在MS 2K8 BI服务器上运行,其中一些每天运行,另一些每小时运行,每两分钟运行一次(另一个进程的心跳监视器)。还有一个应用程序,它可以每隔几分钟、24小时导入数据。偶尔,一些更新和报告的组合会发生冲突,一个或另一个会挂起半小时或更长时间,而不是通常的60秒 虽然我需要找到这些竞赛条件的根源,但与此同时,我希望设置某些作业在(比如)五分钟后自动死亡。我可以在SSIS或Windows计划任务中执行此操作,但在SQL代理中看不到任何方法。这是可能的,还是需要将任务包装

下午好。我有几个SQL代理作业在MS 2K8 BI服务器上运行,其中一些每天运行,另一些每小时运行,每两分钟运行一次(另一个进程的心跳监视器)。还有一个应用程序,它可以每隔几分钟、24小时导入数据。偶尔,一些更新和报告的组合会发生冲突,一个或另一个会挂起半小时或更长时间,而不是通常的60秒

虽然我需要找到这些竞赛条件的根源,但与此同时,我希望设置某些作业在(比如)五分钟后自动死亡。我可以在SSIS或Windows计划任务中执行此操作,但在SQL代理中看不到任何方法。这是可能的,还是需要将任务包装在SSIS包中才能获得这种控制


仅供参考,以下是我最终使用的SQL代理作业:

DECLARE @Cancelled BIT
EXEC dbo.CancelJob @JobName = 'ETL - Daily', @Cancelled = @Cancelled OUT

IF @Cancelled = 1
    BEGIN
    DECLARE @Success INT
    EXEC @Success = msdb..sp_send_dbmail
        @profile_name = 'Reporting',
        @recipients = 'reporting@mycompany.com',
        @subject = 'Cancelled Daily ETL'
    IF @Success <> 0 RAISERROR('An error occurred while attempting to send an e-mail.', 16, @Success)
    END

xp\u sqlagent\u enum\u作业
是避免不可修补错误的诀窍。

我从来没有经常这样做过,因此可能有更好的长期解决方案,但我创建了第二个作业,在我必须执行此任务的罕见情况下停止第一个作业。我只是使用了sp_stopjob过程来实现这一点。

我的第一个想法是,这将需要为每个作业创建一个邪恶的孪生兄弟,计划在第一个作业后运行X分钟,但最好是在每个重要作业开始时调用msdb..sp_stop_job,终止可能干扰即将启动的作业的任何其他正在运行的作业。不错。谢谢,道格!如果作业未运行,sp_stop_作业似乎会引发不可修补的异常(WTF!?)。我的解决方法是在作业中的一个单独步骤中设置停止,并使用“出错”操作“转到下一步”。显而易见的解决方案是在尝试终止作业之前检查作业是否正在运行,但AIK sp_help_作业是了解作业当前是否正在运行的唯一方法,它不能与INSERT EXEC一起使用。有人有更好的主意吗?
CREATE PROCEDURE dbo.CancelJob(@JobName VARCHAR(100), @OwnerName VARCHAR(100) = NULL, @Cancelled BIT OUT)
AS BEGIN
    IF @OwnerName IS NULL SET @OwnerName = SUSER_NAME()
    SET @Cancelled = 0

    CREATE TABLE #JobInfo
        ( 
        Job_ID  UNIQUEIDENTIFIER,
        Last_Run_Date   INT,
        Last_Run_Time   INT,
        Next_Run_Date   INT,
        Next_Run_Time   INT,
        Next_Run_Schedule_ID    INT,
        Requested_To_Run    INT,
        Request_Source  INT,
        Request_Source_ID   VARCHAR(100),
        Running INT,  -- This is the only field we want (sigh)
        Current_Step    INT,
        Current_Retry_Attempt   INT,
        State   INT
        )
    INSERT INTO #JobInfo
        EXEC xp_sqlagent_enum_jobs 1, @OwnerName

    DECLARE @Running INT = (SELECT Running FROM #JobInfo AS JI INNER JOIN msdb..sysjobs_view AS J ON JI.Job_ID = J.job_id WHERE J.name = @JobName)
    IF @Running = 1
        BEGIN
        BEGIN TRY
            EXEC msdb..sp_stop_job @job_name = @JobName
            SET @Cancelled = 1
        END TRY
        BEGIN CATCH
            -- If an error occurs, it is *probably* because the job finished before we could cancel it, which is fine
        END CATCH
        END
END
GO