我正在尝试将所有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
如果您有任何其他建议,可以更好地做到这一点,请不要犹豫,给我一个想法。
答案 0 :(得分:1)
a)创建一个proc,它通过具有适当frequency
值的proc列表运行,执行它们并更新lastrun
列。
@frequency
,将其传递到外面。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
创建作业" DAILY PROCS" ,为此作业分配计划以使其每天运行。
使用T-SQL添加作业步骤:
exec dbo.RunProcs @Frequency = 'day'
创建一份工作" WEEKLY PROCS" ,为此作业分配一个计划,使其每周运行一次
使用T-SQL添加作业步骤:
exec dbo.RunProcs @Frequency = 'week'
创建一个" MONTHLY PROCS" 作业,为此作业分配一个计划,使其每个月运行一次
使用T-SQL添加作业步骤:
exec dbo.RunProcs @Frequency = 'month'