Dans cette question: https://stackoverflow.com/questions/184445825/how-to-knking-statut-of-curquemment-running-jobs
Cette réponse a été proposée:
SELECT sj.name
, sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
AND sja.stop_execution_date IS NULL
Cependant, pour l'un de mes serveurs, cela a une entrée en arrière il y a 10 mois. En regardant dans SQL Agent Job Activity Monitor affiche aucun emploi en cours d'exécution. En regardant dans msdb..sysjobs montre un simple travail d'emploi. Quelqu'un peut-il expliquer ce phénomène?
La rangée orpheline a des nuls pour filed_date, stop_execution_date, job_history_id et next_scheduld_date_date. Le reste des valeurs a l'air raisonnable.
Qui sait! Juste ajouter quelque chose comme
and sja.start_execution_date >= DATEADD(dd, -1, GETDATE())
Ceci est ma réponse actuelle dans mon environnement. Cela fonctionne pour moi comme le plus grand script que cela fait partie des courses quotidiennement. Il se sent comme une meilleure réponse ou une meilleure explication devrait être disponible.
Une réponse StackoverFlow a une explication possible:
Citer:
Chaque fois que l'agent SQL commence, il met une nouvelle ligne dans SysSessions puis toute exécution des travaux obtiendra cette session_id dans la sysjobactivité. Pour vos emplois qui ont une date d'arrêt NULL, je suppose que ce ne sont pas pour la session "actuelle" qui signifierait qu'ils fonctionnaient toujours lorsque l'agent a été arrêté.
J'ai eu un problème similaire où deux entrées de sysjobactivité semblaient être "bloquées", avec un fichier start_execution_date de six semaines de retour et aucun stop_execution_date. Suite à la suggestion dans la citation ci-dessus, j'ai vérifié la session_id pour chacun de ces enregistrements bloqués et trouvé dans chaque cas, les enregistrements bloqués étaient des sessions précédentes.
La réponse Stackoverflow suivante montre comment obtenir uniquement l'activité de la session en cours:
https://stackoverflow.com/a/18062236/21644
Leur code:
SELECT
job.name,
job.job_id,
job.originating_server,
activity.run_requested_date,
DATEDIFF( SECOND, activity.run_requested_date, GETDATE() ) as Elapsed
FROM
msdb.dbo.sysjobs_view job
JOIN
msdb.dbo.sysjobactivity activity
ON
job.job_id = activity.job_id
JOIN
msdb.dbo.syssessions sess
ON
sess.session_id = activity.session_id
JOIN
(
SELECT
MAX( agent_start_date ) AS max_agent_start_date
FROM
msdb.dbo.syssessions
) sess_max
ON
sess.agent_start_date = sess_max.max_agent_start_date
WHERE
run_requested_date IS NOT NULL AND stop_execution_date IS NULL