Une procédure pour connaître l’état d’un job

Voici une petite procédure stockée utilitaire qui retourne 1 si le job est en cours d’exécution, et 0 à l’inverse …

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
---------------------------------
-- Nicolas SOUQUET - 18/05/2009 -
---------------------------------
CREATE PROCEDURE [dbo].[PsIsJobRunning]
  @nomJob SYSNAME
AS
BEGIN
  -- Récupère l'identifiant du job
  DECLARE @job_id UNIQUEIDENTIFIER,
      @isRunning BIT = 0
 
  SELECT @job_id = job_id
  FROM msdb.dbo.sysjobs
  WHERE name = @_szNomJob
 
  DECLARE @Enum_Jobs TABLE
  (
    JobID UNIQUEIDENTIFIER,
    LastRunDate INT,
    LatRunTime INT,
    NextRunDate INT,
    NextRunTime INT,
    NextRunScheduleID INT,
    RequestedToRun INT,
    RequesteSource INT,
    RequesteSourceID NVARCHAR(100),
    Running INT,
    CurrentStep INT,
    CurrentRetryAttempt INT,
    State INT
  )
 
  INSERT INTO @Enum_Jobs
  EXECUTE master.dbo.xp_sqlagent_enum_jobs 1, 'sa', @job_id
 
  SELECT @isRunning = ISNULL(CAST(Running AS BIT), 0)
  FROM @Enum_Jobs
 
  RETURN @isRunning
END

Notons que la colonne « Running » retournée par la procédure stockée étendue (et non-documentée) xp_sqlagent_enum_job peut prendre les valeurs suivantes :

0 = arrêté ou suspendu,
1 = en cours d’exécution,
2 = en attente d’un thread,
3 = réessai,
4 = arrêté,
5 = suspendu,
6 = en attente de terminaison d’étape,
7 = exécutions des actions d’achèvement

Vous remarquerez que j’aurai du vous proposer un code prenant en compte le statut d’identifiant 4, mais lorsqu’on requête pour un job arrêté, c’est bien le statut d’identiant 1 qui est retourné …

ElSuket

Laisser un commentaire