Агент SQL: установите максимальное время выполнения - PullRequest
2 голосов
/ 12 марта 2011

Во второй половине дня.У меня есть несколько заданий агента SQL, работающих на BI-сервере MS 2K8, некоторые из них ежедневно, другие ежечасно и одно каждые две минуты (монитор сердечного ритма для другого процесса).Существует также приложение, которое импортирует данные каждые несколько минут, круглосуточно.Иногда некоторые комбинации обновлений и отчетов сталкиваются, и тот или иной зависает на полчаса или более вместо обычных 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

... и вот код, стоящий за CancelJob:

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

xp_sqlagent_enum_jobs - хитрость, позволяющая избежать неуловимой ошибки.

1 Ответ

4 голосов
/ 12 марта 2011

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

...