程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 通過存儲過程建立靈活的SQL計劃任務

通過存儲過程建立靈活的SQL計劃任務

編輯:關於SqlServer

在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 

--下面是過程實體

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved