如何执行SQL表中列出的SQL Server代理作业

时间:2016-03-11 21:44:59

标签: sql sql-server tsql sql-server-2012

我正在尝试将所有SQL Server代理作业存储在表名中,并希望根据其加载频率执行它们。

CREATE TABLE Maintainance
(
SQLJobName varchar(100), --SQL Job Name which needs to be executed
Frequency varchar(50), -- It can be Daily, Monthly, Weekly, Yearly
ManualRunDate date,  --If Frequency is not given need to execute on this date
LastRunDate datetime, -- If job ran successful it will put the date and time
IsSucceed bit, --1 for Success 0 for fail
Email nvarchar(50) -- email address
)

我想使用TSQL执行这些作业。此外,表中可能有多个作业需要运行。如果第一个工作失败,它应该通过电子邮件发送表中列出的人员,它将执行下一个工作。我怎样才能使用游标或只是在sql中使用While循环?

declare cur cursor for
select Frequency from Maintainance

declare @x int
open cur
fetch next from cur into @x

while @@FETCH_STATUS = 0
BEGIN
    EXEC msdb.dbo.sp_start_job @job_name = @job_name

    fetch next from cur into @x
END

如果您有任何其他建议,可以更好地做到这一点,请不要犹豫,给我一个想法。

1 个答案:

答案 0 :(得分:1)

a)创建一个proc,它通过具有适当frequency值的proc列表运行,执行它们并更新lastrun列。

  1. 在其中创建一个参数@frequency,将其传递到外面。
  2. 使用此参数过滤您的过程列表
  3. 使用此"频率"循环显示过程列表。并运行procs
  4. e.g。

    alter proc dbo.RunProcs
      @Frequency varchar(50)
    as
    begin
      declare @crProcs cursor 
    
      set @crProcs = cursor fast_forward for
      select m.ProcName
      from dbo.Maintainance m
      where m.Frequency = @Frequency
      order by 1
    
      ...
      while @@fetch_status = 0
      beign
          begin try
            exec @ProcName
            ...
            update -> succeded
            ...
          end try
          begin catch
            ...
            update -> failed
            ...
          end catch
        fetch ...
      end
    
      return 1
    end
    

    b)创建预定作业以运行此proc

    1. 创建作业" DAILY PROCS" ,为此作业分配计划以使其每天运行。

      使用T-SQL添加作业步骤: exec dbo.RunProcs @Frequency = 'day'

    2. 创建一份工作" WEEKLY PROCS" ,为此作业分配一个计划,使其每周运行一次

      使用T-SQL添加作业步骤: exec dbo.RunProcs @Frequency = 'week'

    3. 创建一个" MONTHLY PROCS" 作业,为此作业分配一个计划,使其每个月运行一次

      使用T-SQL添加作业步骤: exec dbo.RunProcs @Frequency = 'month'