下面是三種擷取Job調度時間的方法:
第一種:
1 declare
2 @jobid varchar(50),
3 @newjobid varchar(50)
4 select @jobid = replace(job_id, '-', '')
5 from msdb.dbo.sysjobs where name = 'create_snapshotjob'
6 select @jobid
7 set @newjobid = SUBSTRING(@jobid, 7, 2)+SUBSTRING(@jobid, 5, 2)+SUBSTRING(@jobid, 3, 2)+SUBSTRING(@jobid, 1, 2)
8 +SUBSTRING(@jobid, 11, 2)+SUBSTRING(@jobid, 9, 2)+SUBSTRING(@jobid, 15, 2)+SUBSTRING(@jobid, 13, 2)+SUBSTRING(@jobid, 17, 50)
9
10 select a.*, b.*
11 from sys.dm_exec_sessions a
12 inner join sys.dm_exec_requests b on b.session_id = a.session_id
13 where program_name like 'SQLAgent - TSQL JobStep (Job 0x'+@newjobid+'%'
第二種:
exec msdb.dbo.sp_help_job
第三種:
exec master.dbo.xp_sqlagent_enum_jobs 1, ''
根據執行的情況來觀察第一和第二種方法應該是在SQL Server服務內部的狀態擷取,第一種方法是獲得Job進程情況,而第二種未知。但通過觀察第二種和第一種的表現是基本一樣的。
是通過Job的執行過程中抓取的三種指令碼出來的情況,我們可以看到
第一種方法可以抓到一個Job執行的進程資訊。說明該Job正在執行,這裡執行的是一個CREATE DATABASE進程。
第二種方法可以看到當前Job的current_execution_status 為 1 是正在執行,同時 current_execution_step顯示執行步驟
第三種方法同第二種方法,顯示running為1是執行狀態,同時current step顯示執行步驟
這可以說明三種方法都可以捕獲到Job的執行情況,那麼我們在使用中會應用哪中方法呢?
上面這圖是Job執行快結束時捕獲的,我們可以看到目前Job還在執行,但是第一和第二種方法中顯示Job已經執行完成。而第三種方法可以看到JOB還在執行,但是Current step為0 說明沒有步驟在執行。
從上面的分析我們可以得出,第一種方法和第二種方法應該可以擷取到Job的執行步驟但是無法擷取整個JOb的當前準確狀態。而第三種方法可以擷取Job的每個步驟及整個Job的所有狀況。實際應用的時候可以根據情況來選擇方法。