【问题标题】:How to execute SQL Server Agent Jobs which are listed in SQL Table如何执行 SQL 表中列出的 SQL Server 代理作业
【发布时间】:2016-03-11 21:44:59
【问题描述】:

我正在尝试将所有 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

如果您有任何其他建议可以做得更好,请随时给我一个想法。

【问题讨论】:

  • 我能问一下为什么您要半手动执行作业,而不是根据您的需要安排这些作业运行吗?请注意,工作的内在好处是您能够安排它们并对事件做出反应,无论是失败还是成功。
  • 有多个作业,要求创建表并将不同的作业名称放入表中,有些作业需要从表中获取日期并在该日期执行。我们无需查看历史记录,只需检查作业运行的时间和下一次运行的时间。
  • 所以如果我理解正确,您不是在尝试手动执行作业吗?您的目标是查询表中作业的历史记录?如果您尝试实现任何类型的作业调度覆盖,我会重新审视您的要求,因为这是作业的工作:调度存储过程的执行。
  • 我想根据表中的加载频率执行作业。如果它说每天它需要每天执行。我不想在创建作业时安排作业。我想创建它们并根据维护表频率运行它们。
  • >>我们可以只检查作业何时运行以及下一次运行时间的表,而不是查看历史记录。mssqltips.com/sqlservertip/2850/…

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


【解决方案1】:

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

  1. 在其中创建一个参数@frequency,将其传递到外部。
  2. 使用此参数过滤您的 proc 列表
  3. 循环使用此“频率”的 procs 列表并运行 procs

例如

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) 创建计划的作业来运行这个过程

  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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多