在SQL2005裡我們可以直接建立計劃任務,但是有時候我們又希望這計劃任務靈活些,希望帶些參數什麼的。
比如我們想通過ASP.Net這樣B/S結合的形式建立計劃任務,通過頁面臨時的參數,讓其建立不同的計劃任務。
在查找了一些資料後發現QUARTZ可以,但是有些麻煩。後來找到了個存儲過程建立計劃任務方式,稍微修改了下,分享給大家
CREATE proc [dbo].[p_createjob]
@jobname varchar(100),--作業名稱
@sql varchar(8000),--要執行的命令
@dbname sysname='',--默認為當前的數據庫名
@freqtype varchar(6)='day',--時間周期,month 月,week 周,day 日
@fsinterval int=1,--相對於每日的重復次數
@time int=170000--開始執行時間,對於重復執行的作業,將從0點到23:59分
as
if isnull(@dbname,'')='' set @dbname=db_name()
--判斷作業是否存在
if exists(select * from msdb.dbo.sysjobs
where name=@jobname)
begin
--如果作業存在則先刪除原來作業
EXECUTE msdb..sp_delete_job @job_name = @jobname
end
--創建作業
exec msdb..sp_add_job @job_name=@jobname
--創建作業步驟
exec msdb..sp_add_jobstep @job_name=@jobname,
@step_name = '數據處理',
@subsystem = 'TSQL',
@database_name=@dbname,
@command = @sql,
@retry_attempts = 5, --重試次數
@retry_interval = 5 --重試間隔
--創建調度
declare @ftype int,@fstype int,@ffactor int
select @ftype=case @freqtype when 'day' then 4
when 'week' then 8
when 'month' then 16 end
,@fstype=case @fsinterval when 1 then 0 else 8 end
if @fsinterval<>1 set @time=0
set @ffactor=case @freqtype when 'day' then 0 else 1 end
EXEC msdb..sp_add_jobschedule @job_name=@jobname,
@name = '時間安排',
@freq_type=@ftype , --每天,8 每周,16 每月
@freq_interval=1,--重復執行次數
@freq_subday_type=@fstype,--是否重復執行
@freq_subday_interval=@fsinterval, --重復周期
@freq_recurrence_factor=@ffactor,
@active_start_time=@time --下午17:00:00分執行
-- 添加目標服務器
EXEC msdb..sp_add_jobserver
@job_name = @jobname,
@server_name = N'(local)'
在中間部分我偷懶了些,直接把存在的計劃任務刪除了重新建立(這樣歷史會丟失),要做的更完美些的化,其實可以判斷如果不存在該計劃任務的話,先建立,否則則修改,可以通過msdb..sp_update_job 來實現
在這裡的@SQL,可以是帶參數的存儲過程啥的。
另外對於按月統計型的存儲過程,可以這樣實現:exec test 100 這樣實際每次實行此存儲過程的時候過程實體裡都是當月信息,取年同理
create proc test
@temp_month int =100
if @temp_month=100 begin set @temp_month=month(getdate()) end
--下面是過程實體