別のジョブ内でSQL Serverジョブを呼び出す


10

SQL Serverジョブを呼び出して別のジョブ内で実行することは可能ですか?

ジョブ1のすべてのステップをジョブ2に追加できることはわかっていますが、そうしたくないのです。1つはジョブ2がすでに非常に大きく、2つ目はジョブ間でステップをコピーするためのコピー/貼り付けオプションが見つからなかったため、手動でステップを追加するのに時間がかかります。

任意の提案をいただければ幸いです。

回答:


7
  • ステップを追加するジョブを右クリックし、「スクリプトジョブ->新しいクエリウィンドウに作成」を選択します。結果のスクリプトで、この形式のすべてのセクションを探します。
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'<stepname>', 
  @step_id=1, 
  @cmdexec_success_code=0, 
  @on_success_action=3, 
  @on_success_step_id=0, 
  @on_fail_action=2, 
  @on_fail_step_id=0, 
  @retry_attempts=0, 
  @retry_interval=0, 
  @os_run_priority=0, @subsystem=N'TSQL', 
  @command=N'<code>', 
  @database_name=N'', 
  @flags=0
  • 新しいクエリウィンドウを開き、これを実行します。
DECLARE @jobId BINARY(16)
    SET @jobId = (SELECT job_id FROM msdb.dbo.sysjobs WHERE name = '<job name, to which you want to copy the steps>')

-- Followed by all the msdb.dbo.sp_add_jobstep from the script that scripted out in the earlier step

    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'<stepname>', 
      @step_id=1, 
      @cmdexec_success_code=0, 
      @on_success_action=3, 
      @on_success_step_id=0, 
      @on_fail_action=2, 
      @on_fail_step_id=0, 
      @retry_attempts=0, 
      @retry_interval=0, 
      @os_run_priority=0, @subsystem=N'TSQL', 
      @command=N'<code>', 
      @database_name=N'', 
      @flags=0

14

オプション1

Job2で、TSQLコマンドタイプのジョブステップを作成します。コンテンツで、既存のジョブ(sp_start_job)を実行させる

EXECUTE msdb.dbo.sp_start_job 'Job1'

これは非同期で実行されるため、ストアドプロシージャの呼び出しを開始すると、ジョブの次のステップに戻り、実行されます。その開始されたジョブが完了するのを待ちません。呼び出されたジョブが失敗した場合、呼び出し元のジョブにパーコレートされません。

オプション2

Job1を右クリックし、新しいクエリウィンドウにスクリプトを記述します。それをJob2で繰り返し、必要に応じてジョブステップを1から2にスレッド化します。ホイールを再作成するよりもはるかに少ないクリックで、うまくいけばエラーが発生しにくくなります。


お返事をありがとうございます。オプション2に行かなければならないようですが、正しく理解できたかどうかはわかりません。両方のジョブのスクリプトを作成してから、job1の最後にjob2のステップを追加する必要があるということですか?そうですか?
Sky

6

Stackoverflowから(mafafu)

WAITFOR DELAY '00:00:02';
while exists (select * from msdb.dbo.sysjobs j 
                inner join msdb.dbo.sysjobactivity a on j.job_id = a.job_id 
                where name = 'Job 1' 
                and stop_execution_date is null and start_execution_date is not null)
begin
    PRINT 'Waiting...'
    WAITFOR DELAY '00:00:02';   
end

これは、最初のジョブの実行に基づいて2番目のジョブ(翌日の早朝に実行される)の実行を夜遅くまで遅らせる必要がある場合に役立ちました。
James D

私はSYNC(Daily)とIncremental(Hourly)のジョブを実行しています。これにより、増分をチェックし続け、同期が完了するまで待機するのに役立ちました。
snp.it
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.