Во второй половине дня.У меня есть несколько заданий агента 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
- хитрость, позволяющая избежать неуловимой ошибки.