ジョブをスケジュールするストアド プロシージャがあります。このジョブは完了するまでに長い時間がかかります (約 30 ~ 40 分)。このジョブのステータスを知る必要があります。以下の詳細は私を助けるでしょう
1) 将来に予定されていて、まだ開始されていないすべてのジョブのリストを表示する方法
2) 実行中のジョブのリストと実行中からの時間範囲を表示する方法
3) ジョブが正常に完了したか、エラーのために途中で停止したかを確認する方法。
ジョブをスケジュールするストアド プロシージャがあります。このジョブは完了するまでに長い時間がかかります (約 30 ~ 40 分)。このジョブのステータスを知る必要があります。以下の詳細は私を助けるでしょう
1) 将来に予定されていて、まだ開始されていないすべてのジョブのリストを表示する方法
2) 実行中のジョブのリストと実行中からの時間範囲を表示する方法
3) ジョブが正常に完了したか、エラーのために途中で停止したかを確認する方法。
システム ストアド プロシージャ sp_help_job を使用してみることができます。これにより、ジョブ、そのステップ、スケジュール、およびサーバーに関する情報が返されます。例えば
EXEC msdb.dbo.sp_help_job @Job_name = 'Your Job Name'
SQL Books Onlineには、返されるレコードに関する多くの情報が含まれている必要があります。
複数のジョブに関する情報を返すには、ジョブに関するさまざまな情報を保持する次のシステム テーブルをクエリしてみてください。
それらの名前は一目瞭然です (ジョブが最後に実行されたときと結果に関する情報を保持する SysJobServer は別として)。
ここでも、フィールドに関する情報は MSDN にあります。たとえば、SysJobsのページを確認してください。
これは、実行中のジョブを取得するために使用しているものです (主に、おそらくハングしたジョブを強制終了できるようにするためです)。
SELECT
job.Name, job.job_ID
,job.Originating_Server
,activity.run_requested_Date
,datediff(minute, activity.run_requested_Date, getdate()) AS Elapsed
FROM
msdb.dbo.sysjobs_view job
INNER JOIN msdb.dbo.sysjobactivity activity
ON (job.job_id = activity.job_id)
WHERE
run_Requested_date is not null
AND stop_execution_date is null
AND job.name like 'Your Job Prefix%'
ティムが言ったように、MSDN / BOL のドキュメントは、sysjobsX テーブルの内容についてはかなり適切です。これらは MSDB のテーブルであることを覚えておいてください。
-- Microsoft SQL Server 2008 Standard Edition:
IF EXISTS(SELECT 1
FROM msdb.dbo.sysjobs J
JOIN msdb.dbo.sysjobactivity A
ON A.job_id=J.job_id
WHERE J.name=N'Your Job Name'
AND A.run_requested_date IS NOT NULL
AND A.stop_execution_date IS NULL
)
PRINT 'The job is running!'
ELSE
PRINT 'The job is not running.'
詳細を取得するために、さまざまな方法で msdb を照会できます。
少数です
select job.Name, job.job_ID, job.Originating_Server,activity.run_requested_Date,
datediff(minute, activity.run_requested_Date, getdate()) as Elapsed
from msdb.dbo.sysjobs_view job
inner join msdb.dbo.sysjobactivity activity on (job.job_id = activity.job_id)
where run_Requested_date is not null
and stop_execution_date is null
and job.name like 'Your Job Prefix%'
これらの詳細を表示する方法が指定されていません。
一見すると、Server Management Studioを確認することをお勧めします。
ジョブの下の SQL Server エージェント パーツで、ジョブと現在のステータスを確認できます。ジョブを選択すると、[プロパティ] ページにジョブ履歴へのリンクが表示され、開始時刻と終了時刻、エラーが発生したかどうか、エラーの原因となったステップなどを確認できます。
ジョブが正常に完了したか失敗したときに、アラートと通知を指定して、電子メールで送信したり、ページに呼び出したりすることができます。
ジョブ アクティビティ モニターはありますが、実際に使用したことはありません。お試しいただけます。
T-SQL 経由で確認したい場合は、その方法がわかりません。
ジョブの 1 つが実行されるため、MSDB テーブル (別名、上記のコード) をクエリするサーバーの 1 つで問題が発生しましたが、そうではありませんでした。実行ステータスを返すシステム ストアド プロシージャがありますが、insert exec ステートメントをエラーなしで実行することはできません。その内部には、insert exec ステートメントで使用できる別のシステム ストアド プロシージャがあります。
INSERT INTO #Job
EXEC master.dbo.xp_sqlagent_enum_jobs 1,dbo
そして、それをロードするテーブル:
CREATE TABLE #Job
(job_id UNIQUEIDENTIFIER NOT NULL,
last_run_date INT NOT NULL,
last_run_time INT NOT NULL,
next_run_date INT NOT NULL,
next_run_time INT NOT NULL,
next_run_schedule_id INT NOT NULL,
requested_to_run INT NOT NULL, -- BOOL
request_source INT NOT NULL,
request_source_id sysname COLLATE database_default NULL,
running INT NOT NULL, -- BOOL
current_step INT NOT NULL,
current_retry_attempt INT NOT NULL,
job_state INT NOT NULL)
上記のタスクは機能しますが、msdb.dbo.sysjobactivity で run_Requested_date が null ではなく、stop_execution_date が null である多くのレコードを見てきました ---- ジョブは現在実行されていません。
次のスクリプトを実行して、偽のエントリをすべて消去することをお勧めします (その時点でジョブが実行されていないことを確認してください)。
SQL2008:
delete activity
from msdb.dbo.sysjobs_view job
inner join msdb.dbo.sysjobactivity activity on job.job_id = activity.job_id
where
activity.run_Requested_date is not null
and activity.stop_execution_date is null
;WITH CTE_JobStatus
AS (
SELECT DISTINCT NAME AS [JobName]
,s.step_id
,s.step_name
,CASE
WHEN [Enabled] = 1
THEN 'Enabled'
ELSE 'Disabled'
END [JobStatus]
,CASE
WHEN SJH.run_status = 0
THEN 'Failed'
WHEN SJH.run_status = 1
THEN 'Succeeded'
WHEN SJH.run_status = 2
THEN 'Retry'
WHEN SJH.run_status = 3
THEN 'Cancelled'
WHEN SJH.run_status = 4
THEN 'In Progress'
ELSE 'Unknown'
END [JobOutcome]
,CONVERT(VARCHAR(8), sjh.run_date) [RunDate]
,CONVERT(VARCHAR(8), STUFF(STUFF(CONVERT(TIMESTAMP, RIGHT('000000' + CONVERT(VARCHAR(6), sjh.run_time), 6)), 3, 0, ':'), 6, 0, ':')) RunTime
,RANK() OVER (
PARTITION BY s.step_name ORDER BY sjh.run_date DESC
,sjh.run_time DESC
) AS rn
,SJH.run_status
FROM msdb..SYSJobs sj
INNER JOIN msdb..SYSJobHistory sjh ON sj.job_id = sjh.job_id
INNER JOIN msdb.dbo.sysjobsteps s ON sjh.job_id = s.job_id
AND sjh.step_id = s.step_id
WHERE (sj.NAME LIKE 'JOB NAME')
AND sjh.run_date = CONVERT(CHAR, getdate(), 112)
)
SELECT *
FROM CTE_JobStatus
WHERE rn = 1
AND run_status NOT IN (1,4)