Chúng tôi làm điều gì đó giống như mã dưới đây như là một phần của một hệ thống phụ xử lý công việc ban đêm - đó là phức tạp hơn điều này thực sự trong thực tế; ví dụ: chúng tôi đang xử lý nhiều công việc phụ thuộc lẫn nhau và đọc trong tên công việc và giá trị thời gian chờ từ bảng cấu hình - nhưng điều này sẽ ghi lại ý tưởng:
DECLARE @JobToRun NVARCHAR(128) = 'My Agent Job'
DECLARE @dtStart DATETIME = GETDATE(), @dtCurr DATETIME
DECLARE @ExecutionStatus INT, @LastRunOutcome INT, @MaxTimeExceeded BIT = 0
DECLARE @TimeoutMinutes INT = 180
EXEC msdb.dbo.sp_start_job @JobToRun
SET @dtCurr = GETDATE()
WHILE 1=1
BEGIN
WAITFOR DELAY '00:00:10'
SELECT @ExecutionStatus=current_execution_status, @LastRunOutcome=last_run_outcome
FROM OPENQUERY(LocalServer, 'set fmtonly off; exec msdb.dbo.sp_help_job') where [name] = @JobToRun
IF @ExecutionStatus <> 4
BEGIN -- job is running or finishing (not idle)
SET @dtCurr=GETDATE()
IF DATEDIFF(mi, @dtStart, @dtCurr) > @TimeoutMinutes
BEGIN
EXEC msdb.dbo.sp_stop_job @[email protected]
-- could log info, raise error, send email etc here
END
ELSE
BEGIN
CONTINUE
END
END
IF @LastRunOutcome = 1 -- the job just finished with success flag
BEGIN
-- job succeeded, do whatever is needed here
print 'job succeeded'
END
END
+1 Không có tài sản "timeout" rõ ràng trong trình chỉnh sửa công việc. Tôi quan tâm đến những gì mọi người nghĩ ra. – Tomalak
Tôi nghĩ bạn sẽ phải thêm vào một thiết lập kiểu WAITFOR trong SQL. –