回答

收藏

SQL Agent作业:确定已运行了多长时间

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-14

场景9 U2 i8 D7 `0 V; `
某些SQL Agent Jobs计划在一天中每隔几分钟运行一次。1 k5 {: i5 ^( f2 `' Y
在某些情况下,它会丢失其下一个计划,因为它仍在按上一个计划运行。) j% P7 c( i5 y/ Y* W8 K( ~
每隔一段时间,一项工作可能会“挂起”。这不会产生故障(因为作业尚未停止)。发生这种情况时,可以手动停止该作业,并在下次运行时正常运行。它旨在从停下来的地方重新取回。" ^: @3 W2 c/ y
最有效的方法是什么?, O( X$ n4 q5 r' s% @# w
我想要一种确定名为“ JobX”的SQL代理作业当前正在运行多长时间(以秒为单位)的方法。如果当前未运行,则可以返回零。
( A$ B9 q% j  ^* v, l  r6 @这样,如果作业已经运行了超过特定阈值的时间,我可以将其停止。4 a, p. n. W/ ]$ K# K9 Z
我假设可以使用xp_sqlagent_enum_jobs和sysjobhistory的组合,但是我很好奇是否有更好的解决方案…并且希望可以从其他人已经遇到并解决的障碍中受益。" X; u7 |9 g  [
               
  V, {3 `+ E% S( W3 P) O解决方案:
$ ]( U9 s, z' u/ J0 }+ v               
7 x: O/ L2 M3 K
' }* s. I2 D7 ^3 {; W
- @' t! C: Z8 h, h                此解决方案将起作用:" J/ ^# B  ]5 L. i/ r
SELECT DATEDIFF(SECOND,aj.start_execution_date,GetDate()) AS Seconds
2 K/ J) @  f, A! mFROM msdb..sysjobactivity aj9 {! d5 {& c# W
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id2 w' _+ u$ S- B* b9 e' {7 J
WHERE aj.stop_execution_date IS NULL -- job hasn't stopped running8 k5 g: h* b$ r  Z) m
AND aj.start_execution_date IS NOT NULL -- job is currently running
/ U& r/ m. o8 B7 a+ m. A( @6 E3 ZAND sj.name = 'JobX'
6 k$ H, u9 O! i* f/ @$ D$ e/ zand not exists( -- make sure this is the most recent run/ r; F5 N2 w- }; u/ K. `
    select 1& e9 S4 S3 A$ [6 n
    from msdb..sysjobactivity new
( Z% k' n, ~( |0 V6 M    where new.job_id = aj.job_id
, D& t0 e3 o( O+ |    and new.start_execution_date > aj.start_execution_date
5 z# `+ ~/ d/ x) K; }( }, _)7 Z5 T. t% n3 H0 ]
这是更常规的检查,取决于系统表。如果您希望使用自定义路线,则可以将作业插入到您创建的作业日志表中。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则