定时执行某操作的存储过程(sql作业)(2)

在上一篇中演示了如何手动创建一个作业,接下来介绍如何通过sql语句来实现一个作业的创建。

   如果在上一篇中最后操作完成之后将作业脚本进行了分析的会发现里面其实就是一些关键参数的传递,按照固定的格式进行填充就可以完成一个作业的创建了。
   以下代码都做了注释,可以查阅相关意思

    1 

 2 ALTER PROCEDURE AutoJob
 3 @JobName nvarchar(100),--作业名
 4 @SQLStr nvarchar(500),--要执行的操作内容
 5 @DBName nvarchar(100),--作用的数据库
 6 @StepName nvarchar(100),--步骤名
 7 @RetryTimes int,--重复次数
 8 @RetryInterval int,--重复间隔
 9 @ScheduleName nvarchar(100),--调度名称
10 @FreqType int,--执行作业的周期  4 每天,8 每周,16 每月
11 @FreqInterval int,--每天执行次数
12 @ActiveTime int,--执行的具体时间(格式:hhmmss)
13 @Server varchar(100)--服务器
14 
15 AS
16 --创建作业 
17 EXEC msdb..sp_add_job @job_name=@JobName 
18 
19 --创建作业步骤
20 EXEC msdb..sp_add_jobstep @job_name=@JobName,
21 @step_name=@StepName,
22 @subsystem='TSQL',
23 @database_name=@DBName,
24 @command=@SQLStr,
25 @retry_attempts=@RetryTimes,
26 @retry_interval=@RetryInterval
27 
28 --创建调度
29 EXEC msdb..sp_add_jobschedule @job_name=@JobName,
30 @name=@ScheduleName
31 @freq_type=@FreqType,
32 @freq_interval=@FreqInterval,
33 @active_start_time=@ActiveTime
34 
35 --目标服务器
36 EXEC msdb.dbo.sp_add_jobserver   
37 @job_name=@JobName
38 @server_name=@Server
39 
40 

   以下是摘抄网上一前辈的代码,可以借鉴理解
    1 

 2 
 3  if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Pro_AddTask]'and OBJECTPROPERTY(id, N'IsProcedure'= 1
 4   drop procedure [dbo].[Pro_AddTask] 
 5   GO  
 6   create proc Pro_AddTask
 7   @taskname varchar(100), --task name 
 8   @sql varchar(8000), --slq command 
 9   @dbname sysname=''-- default the current db
10   @freqtype varchar(6)='day'--the frequence of time :month ,week ,day 
11  @freqsubtype varchar(6)='no' ,--no, hour ,minute
12   @fqinterval int=1--the execute times 
13  @fqsubinterval int=1--the sub interval
14   @time int=000000 -- execute on some time format(hhmmss)
15   as 
16  /*--creat task  
17    
18  --author:sky 2008.02.27 
19    
20   discription: 
21   when @freqtype='week' when @fqinterval=
22    1 = 星期日
23    2 = 星期一
24    4 = 星期二
25    8 = 星期三
26    16 = 星期四
27    32 = 星期五
28    64 = 星期六
29  */
30  /*--eg. 
31    
32  --每月执行的作业 
33  exec Pro_AddTask @taskname='mm',@sql='seleCT * from syscolumns',@freqtype='month' 
34    
35  --每周执行的作业 
36  exec Pro_AddTask @taskname='ww',@sql='select * from syscolumns',@freqtype='week' 
37    
38  --每日00000执行的作业 
39  exec Pro_AddTask @taskname='ab',@sql='select * from syscolumns' 
40   
41   --每日12:00:00作业 
42  exec Pro_AddTask @taskname='d12',@sql='select * from syscolumns',@time=12000
43  
44   --每周六12:00:00作业 
45  exec Pro_AddTask @taskname='w12',@sql='select * from syscolumns',@freqtype='week',@fqinterval=64,@time=12000
46   
47   --每月20号12:00:00作业 
48  exec Pro_AddTask @taskname='m20',@sql='select * from syscolumns',@freqtype='month',@fqinterval=20,@time=12000
49   
50  --*/ 
51   if isnull(@dbname,'')='' set @dbname=db_name() 
52   --create task 
53   exec msdb..sp_add_job @job_name=@taskname
54 
55   --create task step  
56   exec msdb..sp_add_jobstep @job_name=@taskname
57   @step_name = 'data process'
58   @subsystem = 'TSQL'
59   @database_name=@dbname
60   @command = @sql
61   @retry_attempts = 5,   
62   @retry_interval = 5  
63   
64   --create schedule 
65   declare @ftype int,@fstype int,@ffactor int 
66   select @ftype=case @freqtype  
67     when 'day' then 4 
68     when 'week' then 8 
69     when 'month' then 16 
70    end 
71  ,@fstype=case @freqsubtype 
72    when 'no' then 1 
73    when 'hour' then  4
74    when 'minutue' then 8
75    else 0  
76    end 
77   set @ffactor=case @freqtype when 'day' then 0 else 1 end 
78   
79   EXEC msdb..sp_add_jobschedule @job_name=@taskname,   
80   @name = 'schedule'
81   @freq_type=@ftype , ---4 每天,8 每周,16 每月  
82   @freq_interval=@fqinterval--作业执行的天数
83   @freq_subday_type=@fstype--是否重复执行,0x1 在指定的时间, 0x4 分钟, 0x8 小时
84   @freq_subday_interval=@fqsubinterval--重复周期 
85   @freq_recurrence_factor=@ffactor--重复执行,则设置为1,否则设置为0
86   @active_start_time=@time   --下午00:00:00分执行 
87   -- add the goal server 
88   EXEC msdb.dbo.sp_add_jobserver   
89   @job_name = @taskname  , 
90   @server_name = N'(local)'
原文地址:https://www.cnblogs.com/tzy080112/p/1402391.html