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 分の待機を行うジョブを設定してみます。
これを「sp_start_job」で実行すると、2 分後にクエリが実行完了するのではなく、即時で実行完了となります。
上述クエリ経由でジョブを実行すると、完了するまで待機することになりますので、2 分程度の実行時間となっているのが確認できます。
# SSMS から実行しているため、コマンドのタイムアウトは気にしていませんが、プログラム経由で実行する場合はコマンドタイムアウトの考慮が必要となります。
ジョブを停止 (実行後の停止) をした場合の停止の検知も行われるため、基本的な実行のサンプルにはなっているかと思います。