SQL Server 如何准确获取Job的调度时间
下面是三种获取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的所有状况。实际应用的时候可以根据情况来选择方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现