Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何执行SQL表中列出的SQL Server代理作业_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

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

如何执行SQL表中列出的SQL Server代理作业,sql,sql-server,tsql,sql-server-2012,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

我正在尝试将所有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
如果您有任何其他建议,这可以做得更好,请不要犹豫,给我一个想法

a)创建一个进程,该进程以适当的
频率
值在进程列表中运行,执行它们并更新
lastrun

  • 在里面做一个参数
    @frequency
    ,从外面传出去
  • 使用此参数筛选进程列表
  • 循环使用此“频率”的进程列表并运行进程
  • e、 g

    b) 创建计划作业以运行此过程

  • 创建一个作业“每日进程”,为该作业分配一个时间表,使其每天运行。 使用T-SQL添加作业步骤:
    exec dbo.RunProcs@Frequency='day'

  • 创建作业“每周进程”,为该作业分配一个时间表,使其每周运行一次 使用T-SQL添加作业步骤:
    exec dbo.RunProcs@Frequency='week'

  • 创建作业“每月进程”,为该作业分配一个时间表,使其每月运行一次 使用T-SQL添加作业步骤:
    exec dbo.RunProcs@Frequency='month'


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