在另一个作业中调用 SQL Server 作业

Sky*_*Sky 12 sql-server-2008-r2 jobs

是否可以调用 SQL Server 作业在另一个作业中运行?

我知道我们可以将作业 1 的所有步骤添加到作业 2,但我不想这样做。首先,作业 2 已经很大,其次我找不到复制粘贴选项来在作业之间复制步骤,因此手动添加步骤会很耗时。

任何建议表示赞赏。

bil*_*nkc 15

选项1

在 Job2 中,创建一个 TSQL 命令类型的作业步骤。在内容中,让它运行现有的作业 ( sp_start_job )

EXECUTE msdb.dbo.sp_start_job 'Job1'
Run Code Online (Sandbox Code Playgroud)

那将异步运行,因此在它开始调用存储过程后,它将返回并执行作业中的下一步。它不会等待已开始的作业完成。如果被调用的作业失败,它将不会渗透回调用作业。

选项 2

右键单击 Job1 并将脚本写入新的查询窗口。对 Job2 重复此操作,然后根据需要将作业步骤从 1 线程化到 2。点击次数比重新创建轮子要少得多,并且希望更不容易出错。


Wri*_*ree 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
Run Code Online (Sandbox Code Playgroud)
  • 打开一个新的查询窗口并运行:
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
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)