如何执行SQL表中列出的SQL Server代理作业
我正在尝试将所有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
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
,从外面传出去exec dbo.RunProcs@Frequency='day'
exec dbo.RunProcs@Frequency='week'
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