Sql-Server
從 SSRS 執行作業時返回 SSRS 中的 SQL 代理作業狀態
我正在從 SSRS 呼叫 SQL 代理作業並使用參數來確定要執行的作業。
我可以很好地執行這項工作。我要做的是根據工作狀態向使用者返回一條消息。
以下是它的執行方式:
IF @Job = 'Run' BEGIN EXEC msdb.dbo.sp_start_job 'Run selected job' END IF @Job = 'Delete Previous Run' AND @Confirm = 'DELETE' BEGIN EXEC msdb.dbo.sp_start_job 'Delete Previous Run' END
當我
EXEC
時,唯一返回的是Job '<job name>' completed successfully
我希望在作業完成後立即返回 SQL 代理狀態。我怎樣才能做到這一點?
該
sp_start_job
過程啟動作業,然後在作業非同步執行時返回給您。它不會等待作業執行——只需啟動它並離開。如果你想讓你的 SQL 坐下來等待作業執行,你需要在你的 T-SQL 中引入一個循環
WAITFOR DELAY 'HH:MI:SS'
,然後檢查作業狀態,然後重複直到作業達到可以返回的終端狀態給使用者。
sp_help_job
將為您提供作業狀態,但它使用#temp
表,如果您嘗試自己將結果sp_help_job
插入臨時表,這可能會導致程式碼出現問題,您將遇到錯誤 8164,“無法嵌套 INSERT EXEC 語句。” 有些人會使用xp_sqlagent_enum_jobs
一個未記錄的內部過程,它會返回類似的結果。但是,因為它沒有文件化,我不希望在生產程式碼中使用它,因為行為可能會在 SQL Server 的未來版本或 CU 中發生變化。每次圍繞該循環,您都會執行以下操作來獲取作業狀態(或從我的開源 DBA 數據庫中獲取函式,我將在我的部落格文章中進一步描述):
DECLARE @JobName nvarchar(200) = N''; SELECT TOP 1 JobName = j.name, IsRunning = CASE WHEN ja.job_id IS NOT NULL AND ja.stop_execution_date IS NULL THEN 1 ELSE 0 END, JobLastOutcome = CASE WHEN ja.job_id IS NOT NULL AND ja.stop_execution_date IS NULL THEN 'Running' WHEN jh.run_status = 0 THEN 'Failed' WHEN jh.run_status = 1 THEN 'Succeeded' WHEN jh.run_status = 2 THEN 'Retry' WHEN jh.run_status = 3 THEN 'Cancelled' END FROM msdb.dbo.sysjobs j LEFT JOIN msdb.dbo.sysjobactivity ja ON ja.job_id = j.job_id AND ja.run_requested_date IS NOT NULL AND ja.start_execution_date IS NOT NULL LEFT JOIN msdb.dbo.sysjobsteps js ON js.job_id = ja.job_id AND js.step_id = ja.last_executed_step_id LEFT JOIN msdb.dbo.sysjobhistory jh ON jh.job_id = j.job_id AND jh.instance_id = ja.job_history_id WHERE j.name = @JobName ORDER BY ja.start_execution_date DESC;