順次実行する必要があるSQL Serverエージェントジョブがいくつかあります。実行する必要があるジョブの概要をわかりやすくするために、への呼び出しで他のジョブを呼び出すメインジョブを作成しましたEXEC msdb.dbo.sp_start_job N'TEST1'
。はsp_start_job
即座に終了しますが(ジョブステップ1)、TEST1
次のジョブを呼び出す前に、ジョブが終了するまでメインジョブを待機させます。
そのため、ジョブが呼び出された直後に実行を開始し(ジョブステップ2)、メインジョブを強制的にサブジョブが完了するまで待機させる次の小さなスクリプトを記述しました。
WHILE 1 = 1
BEGIN
WAITFOR DELAY '00:05:00.000';
SELECT *
INTO #jobs
FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;',
'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'',
@execution_status = 0, @job_aspect = N''JOB''');
IF NOT (EXISTS (SELECT top 1 * FROM #jobs))
BEGIN
BREAK
END;
DROP TABLE #jobs;
END;
これは十分に機能します。しかし、私はよりスマートで安全な(WHILE 1 = 1
?)ソリューションが可能なはずだと感じました。
次の点に興味があります。洞察を提供していただければ幸いです。
- このアプローチの問題は何ですか?
- これを行うためのより良い方法を提案できますか?
(私はコードの改善に焦点を合わせていたので、私は最初にこの質問をStackOverflowに投稿しました。それでも有効です。しかし、私の考えでは、ここにいる人々は一般に、私がこれをやろうとしない方がいい理由について、もっと賢いことを言うでしょう。 mすぐに実行するか、適切な代替手段を提供します。)
編集(7月25日)
どうやら私のスクリプトにはそれほど問題はありません。それに関する問題を指摘する回答の数が少ないためです:-)この種のスクリプトの代替手段は、これらのために設計されたツールを使用することですタスク(SQL Sentry Event Managerまたは...など)-または自分でそのようなツールを作成する。現在の会社ではそのようなツールを購入することはないので、ここではスクリプトのみを使用します。