SQL Serverエージェントジョブを呼び出し、ジョブが正常に実行されたかどうかを返すストアドプロシージャが必要です。
これまでのところ
CREATE PROCEDURE MonthlyData
AS
EXEC msdb.dbo.sp_start_job N'MonthlyData'
WAITFOR DELAY '000:04:00'
EXEC msdb.dbo.sp_help_jobhistory @job_name = 'MonthlyData'
GO
どちらがジョブを開始しますか?ジョブが正常に実行されたかどうかを取り戻すための最良の方法は何ですか?
ジョブは通常4〜3分で実行されるため、[OK]は編集を行い、WAITFOR DELAYを使用しました。ジョブはそれより効率的な方法ですか?
クエリを実行できます:
EXEC msdb.dbo.sp_help_jobhistory
@job_name = N'MonthlyData'
列run_statusを返します。ステータスは次のとおりです。
0 - Failed
1 - Succeeded
2 - Retry
3 - Canceled
[〜#〜] msdn [〜#〜] の詳細
[〜#〜] edit [〜#〜]:ジョブをポーリングして、実行されたことを確認することができます。この情報は、sp_help_jobプロシージャから取得できます。このプロシージャが4
のステータスを返す場合、ジョブがアイドル状態であることを意味します。その後、実行状態を確認しても安全です。
次のコードを使用してポーリングできます。
DECLARE @job_status INT
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''')
WHILE @job_status <> 4
BEGIN
WAITFOR DELAY '00:00:03'
SELECT @job_status = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=.;Trusted_Connection=yes;','exec msdb.dbo.sp_help_job @job_name = ''NightlyBackups''')
END
EXEC msdb.dbo.sp_help_jobhistory
@job_name = N'NightlyBackups' ;
GO
このコードはステータスを確認し、3秒待ってから再試行します。 4のステータスを取得すると、ジョブが完了したことがわかり、ジョブ履歴を確認しても安全です。
許可されていないすべての人に対して、[〜#〜] openrowset [〜#〜]コマンド、これは役立つかもしれません。私はここで私のソリューションの始まりを見つけました:
これは、msdb.dbo.sysjobactivityテーブルのいくつかの列が、ジョブが何らかの方法で終了した後に最初にデータが取り込まれるという事実に依存しています。
-- Start job
DECLARE @job_name NVARCHAR(MAX) = 'JobName'
EXEC msdb.dbo.sp_start_job @job_name = @job_name
-- Wait for job to finish
DECLARE @job_history_id AS INT = NULL
WHILE @time_constraint = @ok
BEGIN
SELECT TOP 1 @job_history_id = activity.job_history_id
FROM msdb.dbo.sysjobs jobs
INNER JOIN msdb.dbo.sysjobactivity activity ON activity.job_id = jobs.job_id
WHERE jobs.name = @job_name
ORDER BY activity.start_execution_date DESC
IF @job_history_id IS NULL
BEGIN
WAITFOR DELAY '00:00:10'
CONTINUE
END
ELSE
BREAK
END
-- Check exit code
SELECT history.run_status
FROM msdb.dbo.sysjobhistory history
WHERE history.instance_id = @job_history_id
WHILEループの実行が許可されている期間をチェックすることをお勧めします。私はその部分を例から除外することにしました。
終了コードなどのMicrosoftガイダンス: http://technet.Microsoft.com/en-us/library/ms174997.aspx
ジョブのステータスを確認し、まだ実行されていない場合に実行するスクリプトを次に示します。
declare @xp_results table (
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)
DECLARE @job_id uniqueidentifier ;
select @job_id = job_id from msdb.dbo.sysjobs where name = 'Job1';
insert into @xp_results
EXEC master.dbo.xp_sqlagent_enum_jobs 1, sa, @job_id
select case when running = 1 then 'Currently Running' else '' end as running,
case job_state
when 0 then 'Not Idle or Suspended'
when 1 then 'Executing Job'
when 2 then 'Waiting For Thread'
when 3 then 'Between Retries'
when 4 then 'Idle'
when 5 then 'Suspended'
when 6 then 'WaitingForStepToFinish'
when 7 then 'PerformingCompletionActions'
end as job_state
from @xp_results
IF (select running from @xp_results) <> 1
EXEC msdb.dbo.sp_start_job 'Job1'
私は少し遅れているかもしれませんが、次のクエリがうまくいくことがわかりました。実行時間と実行終了時間を示します。ステータスを取得するように変更することもできます。
SELECT
job.name,
job.job_id,
job.originating_server,
activity.run_requested_date,
activity.stop_execution_date,
DATEDIFF( SECOND, activity.run_requested_date, activity.stop_execution_date ) 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
AND job.name = @JobName