12

Tôi đã có một công việc SQL Server được lập lịch chạy lâu hơn bình thường, và tôi thực sự có thể đã thực hiện với việc thiết lập một thời gian chờ để ngăn chặn nó sau một khoảng thời gian nhất định.SQL Server Agent Timeout

Tôi có thể bị mù một chút về vấn đề này, nhưng dường như tôi không thể tìm cách đặt thời gian chờ cho công việc. Có ai biết cách để làm điều đó không?

Cảm ơn

+1

+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

+0

Tôi nghĩ bạn sẽ phải thêm vào một thiết lập kiểu WAITFOR trong SQL. –

Trả lời

10

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 
2

Đây là loại công việc gì? Bạn có thể xem xét việc đặt toàn bộ công việc trong một kịch bản lệnh TSQL trong vòng lặp while. Các điều kiện để kiểm tra rõ ràng sẽ là sự khác biệt thời gian giữa thời gian hiện tại và thời gian bắt đầu công việc.

Raj

+0

Với công việc cụ thể này, tôi có thể chia nó ra ... Tôi chỉ hy vọng có thể có một giải pháp "thích hợp". Cảm ơn –