SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server エージェントのジョブをクエリから同期的に実行する

leave a comment

SQL Server エージェントのジョブをクエリから実行する場合「sp_start_job」を使用することができます。

この際の実行ですが、ジョブの起動の可否の取得をすることはできますが、ジブの実行終了を待機するというオプションはありません。

そのため、クエリから SQL Server エージェントのジョブを実行すると、起動可否の情報の取得のみが行われ処理の完了までは待機が行われません。

クエリからジョブを実行した際に、ジョブの完了を待機したい場合、以下のようなクエリを実行する必要があるかと思います。

DECLARE @date varchar(8), @time varchar(8)
SELECT @date = CONVERT(varchar,GETDATE(), 112), @time = REPLACE(CONVERT(varchar,GETDATE(), 108),':','')

DECLARE @ReturnCode int

DECLARE @job sysname = N'TEST'

EXEC @ReturnCode = sp_start_job @job_name=@job

IF @ReturnCode = 0
BEGIN
	WHILE(0 = 0)
	BEGIN
		IF(SELECT COUNT(*) FROM sysjobhistory sh
		LEFT JOIN sysjobs sj ON sh.job_id = sj.job_id 
		WHERE sj.name = @job AND sh.step_id = 0 AND 
		sh.run_date >= @date and sh.run_time >= @time) > 0
		BEGIN
			IF(SELECT run_status FROM sysjobhistory sh
			LEFT JOIN sysjobs sj ON sh.job_id = sj.job_id 
			WHERE sj.name = @job AND sh.step_id = 0 AND 
			sh.run_date >= @date and sh.run_time >= @time) <> 1
			BEGIN
				RAISERROR('Job Execution Error', 15,1)
			END
			BREAK
		END
		ELSE
		BEGIN
			WAITFOR DELAY '00:00:05'
		END
	END
END
ELSE
BEGIN
	RAISERROR('Job Execution Error', 15,1)
END

このクエリは、ジョブを実行した後に、ジョブの実行履歴から、ジョブの実行が完了するまで、定期的に履歴を確認し、ジョブの完了まで状態の確認を繰り返すものとなります。

以下のような 2 分の待機を行うジョブを設定してみます。

image

これを「sp_start_job」で実行すると、2 分後にクエリが実行完了するのではなく、即時で実行完了となります。

image

上述クエリ経由でジョブを実行すると、完了するまで待機することになりますので、2 分程度の実行時間となっているのが確認できます。

# SSMS から実行しているため、コマンドのタイムアウトは気にしていませんが、プログラム経由で実行する場合はコマンドタイムアウトの考慮が必要となります。

image

ジョブを停止 (実行後の停止) をした場合の停止の検知も行われるため、基本的な実行のサンプルにはなっているかと思います。

Written by masayuki.ozawa

1月 29th, 2017 at 10:24 pm

Posted in SQL Server

Tagged with

Leave a Reply

*