この質問では: https://stackoverflow.com/questions/18445825/how-to-know-status-of-currently-running-jobs
この回答が提案されました:
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
しかし、私のサーバーの1つでは、これには10か月前の日付のエントリがあります。 SQLエージェントジョブアクティビティモニターを確認しても、実行中のジョブはありません。 msdb..sysjobsを見ると、わずか3つのジョブが示されています。誰でもこの現象を説明できますか?
孤立した行には、queued_date、stop_execution_date、job_history_id、およびnext_scheduled_dateのNULLがあります。残りの値は妥当に見えます。
知るか!次のようなものを追加するだけです
and sja.start_execution_date >= DATEADD(dd, -1, GETDATE())
これが私の環境での私の現在の答えです。これは、毎日の実行の一部であるより大きなスクリプトとして私にとっては機能します。より良い答えや説明が利用可能であるように感じます。
StackOverflowの回答には、考えられる説明があります。
引用するには:
SQLエージェントが起動するたびに、新しい行がsyssessionsに配置され、その後実行されるすべてのジョブは、sysjobactivityでそのsession_idを取得します。停止日がnullであるジョブの場合、これらのジョブは「現在の」セッション用ではないため、エージェントが停止されたときにジョブがまだ実行中であったと考えられます。
Sysjobactivityの2つのエントリが「スタック」しているように見える同様の問題があり、start_execution_dateが6週間前のもので、stop_execution_dateがありませんでした。上記の引用の提案に従って、スタックされた各レコードのsession_idを確認し、スタックされたレコードがそれぞれ前のセッションのものであることがわかりました。
次のStackOverflowの回答は、現在のセッションのアクティビティのみを取得する方法を示しています。
https://stackoverflow.com/a/18062236/21644
彼らのコード:
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