请教一个计划任务的问题

artwl_cn 2010-09-27 09:27:29
有个临时表,我想在有数据插入时创建一个计划任务,在2小时后清空这个临时表,请问怎么做。

请帮忙解决如下问题:

1、请问怎么用SQL语句创建计划任务

2、怎么做到只在第一条数据插入时创建计划任务,在这两个小时内再插入数据时不创建

3、怎么做到只在同类型数据(临时表中有个Type字段)的第一条数据插入时创建计划任务,在这两个小时内同类型数据再插入时不创建

...全文
89 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
claro 2010-09-27
  • 打赏
  • 举报
回复
如果您是 在 说一个特例,仍建议采用变通的方式。
比如延迟的部分可以设定某个 计划任务定时检查某个时间项,当getdate() 大于时间点+2时即清空临时表。

或者

select into 方式生成临时表,(这样一定存在数据),判断sys.objects或tables的创建时间超过2小时即清空。

所以方式很多,选择简单、有效、合适的。
「已注销」 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 durongjian 的回复:]

引用 4 楼 zsh0809 的回复:
你参考上面一部分就可以了,贴出来的你有些你可能用不着。
不过你这个job生命周期就是2小时么?

谢谢,我正在看,这里只是举个例子,时间可以从另外一张表中得到。
[/Quote]
也可以依照5楼的建议,可以换个思路来解决。
artwl_cn 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zsh0809 的回复:]
你参考上面一部分就可以了,贴出来的你有些你可能用不着。
不过你这个job生命周期就是2小时么?
[/Quote]
谢谢,我正在看,这里只是举个例子,时间可以从另外一张表中得到。
ai_li7758521 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 durongjian 的回复:]
有个临时表,我想在有数据插入时创建一个计划任务,在2小时后清空这个临时表,请问怎么做。
请帮忙解决如下问题:
1、请问怎么用SQL语句创建计划任务
2、怎么做到只在第一条数据插入时创建计划任务,在这两个小时内再插入数据时不创建
3、怎么做到只在同类型数据(临时表中有个Type字段)的第一条数据插入时创建计划任务,在这两个小时内同类型数据再插入时不创建
[/Quote]
其实可以想变通的办法的,比如临时表中插入时间,查询或者更新过程中对时间做处理即可。
「已注销」 2010-09-27
  • 打赏
  • 举报
回复
你参考上面一部分就可以了,贴出来的你有些你可能用不着。
不过你这个job生命周期就是2小时么?
artwl_cn 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zsh0809 的回复:]
1,为什么非要指定sql创建呢?
2,其实你第二点内部就有逻辑问题了,当你清空该表时,不也就是相当于第一次创建么?至少实质上是等价的。
3,....
[/Quote]
数据库计划任务貌似要用SQL创建吧,在代码中另开个线程代价太大了
「已注销」 2010-09-27
  • 打赏
  • 举报
回复
来源网络:
--常用作业定义的T-SQL模板



--定义创建作业

DECLARE @jobid uniqueidentifier

EXEC msdb.dbo.sp_add_job

@job_name = N'作业名称',

@job_id = @jobid OUTPUT



--定义作业步骤

DECLARE @sql nvarchar(400),@dbname sysname

SELECT @dbname=DB_NAME(), --作业步骤在当前数据库中执行

@sql=N'--作业步骤内容' --一般定义的是使用TSQL处理的作业,这里定义要执行的Transact-SQL语句

EXEC msdb.dbo.sp_add_jobstep

@job_id = @jobid,

@step_name = N'作业步骤名称',

@subsystem = 'TSQL', --步骤的类型,一般为TSQL

@database_name=@dbname,

@command = @sql



--创建调度(使用后面专门定义的几种作业调度模板)

EXEC msdb..sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type=4, --每天

@freq_interval=1, --指定每多少天发生一次,这里是1天.

@freq_subday_type=0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次

@freq_subday_interval=1, --重复周期数,这里每小时执行一次

@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD

@active_end_date = 99991231, --作业执行的停止日期,默认为99991231,格式为YYYYMMDD

@active_start_time = 00000, --作业执行的开始时间,格式为HHMMSS

@active_end_time = 235959 --作业执行的停止时间,格式为HHMMSS



--添加目标服务器

DECLARE @servername sysname

SET @servername=CONVERT(nvarchar(128),SERVERPROPERTY(N'ServerName'))

EXEC msdb.dbo.sp_add_jobserver

@job_id = @jobid,

@server_name = @servername --使用当前SQL实例





--调度模板定义

--/*--日调度

EXEC msdb..sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type=4, --每天

@freq_interval=1, --指定每多少天发生一次,这里是1天.

@freq_subday_type=0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次

@freq_subday_interval=1, --重复周期数,这里每小时执行一次

@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD

@active_end_date = 99991231, --作业执行的停止日期,默认为99991231,格式为YYYYMMDD

@active_start_time = 00000, --作业执行的开始时间,格式为HHMMSS

@active_end_time = 235959 --作业执行的停止时间,格式为HHMMSS

--*/



--/*--周调度

EXEC msdb.dbo.sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type = 8, --每周

@freq_recurrence_factor = 1, --每多少周执行一次,这里是每周

@freq_interval = 62, --在星期几执行,由POWER(2,N)表示,N的值为0~6,代表星期日~星期六,如果指定两个,则将值相加,例如,值为65表示在星期天和星期日执行(POWER(2,0)+POWER(2,6))

@freq_subday_type = 0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次

@freq_subday_interval = 1, --重复周期数,这里每小时执行一次

@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD

@active_end_date = 99991231, --作业执行的停止日期,默认为99991231,格式为YYYYMMDD

@active_start_time = 00000, --作业执行的开始时间,格式为HHMMSS

@active_end_time = 235959 --作业执行的停止时间,格式为HHMMSS

--*/



--/*--月调度(每X个月的每月几号)

EXEC msdb.dbo.sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type = 16, --每月

@freq_recurrence_factor = 2, --每多少月执行一次,这里是每2个月

@freq_interval = 2, --在执行月的第几天执行,这里是第2天

@freq_subday_type = 0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次

@freq_subday_interval = 1, --重复周期数,这里每小时执行一次

@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD

@active_end_date = 99991231, --作业执行的停止日期,默认为99991231,格式为YYYYMMDD

@active_start_time = 00000, --作业执行的开始时间,格式为HHMMSS

@active_end_time = 235959 --作业执行的停止时间,格式为HHMMSS

--*/



--/*--月调度(每X个月的相对时间)

EXEC msdb.dbo.sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type = 32, --每月

@freq_recurrence_factor = 2, --每多少月执行一次,这里是每2个月

@freq_interval = 9, --在当月的那个时间执行,1~7=星期日至星期六,8=日 ,9=工作日,10=周末

@freq_relative_interval = 1, --在第几个相对时间执行,允许的值为1,2,4,8代表第1~4个相对时间,16表示最后一个相对时间

@freq_subday_type = 0x8, --重复方式,0x1=在指定的时间,0x4=多少分钟,0x8=多少小时执行一次

@freq_subday_interval = 1, --重复周期数,这里每小时执行一次

@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD

@active_end_date = 99991231, --作业执行的停止日期,默认为99991231,格式为YYYYMMDD

@active_start_time = 00000, --作业执行的开始时间,格式为HHMMSS

@active_end_time = 235959 --作业执行的停止时间,格式为HHMMSS

--*/



--/*--在特定时候执行的作业调度

EXEC msdb.dbo.sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type = 64 --64=在SQLServerAgent 服务启动时运行,128=计算机空闲时运行

--*/



--/*--只执行一次的作业调度

EXEC msdb..sp_add_jobschedule

@job_id = @jobid,

@name = N'调度名称',

@freq_type=1, --仅执行一次

@active_start_date = NULL, --作业执行的开始日期,为NULL时表示当前日期,格式为YYYYMMDD

@active_start_time = 00000 --作业执行的开始时间,格式为HHMMSS

--*/



SQL code

--使用作业定时启停数据库的示例

IF EXISTS(SELECT * FROM msdb.dbo.sysjobs WHERE name='启用pubs数据库')

EXEC msdb.dbo.sp_delete_job @job_name='启用pubs数据库'



--定义创建作业

DECLARE @jobid uniqueidentifier

EXEC msdb.dbo.sp_add_job

@job_name = N'启用pubs数据库',

@job_id = @jobid OUTPUT



--定义作业步骤

DECLARE @sql nvarchar(400),@dbname sysname

SELECT @dbname=N'master', --数据库联机或者脱机只能在master数据库中进行

@sql=N'ALTER DATABASE pubs SET ONLINE' --使用pubs数据库联机(启用)

EXEC msdb.dbo.sp_add_jobstep

@job_id = @jobid,

@step_name = N'启用pubs数据库处理',

@subsystem = 'TSQL',

@database_name=@dbname,

@command = @sql



--创建调度(使用后面专门定义的几种作业调度模板)

EXEC msdb..sp_add_jobschedule

@job_id = @jobid,

@name = N'启用pubs数据库处理调度',

@freq_type=4,

@freq_interval=1,

@freq_subday_type=0x1,

@freq_subday_interval=1,

@active_start_time = 075000 --每天07:50分执行



--添加目标服务器

DECLARE @servername sysname

SET @servername=CONVERT(nvarchar(128),SERVERPROPERTY(N'ServerName'))

EXEC msdb.dbo.sp_add_jobserver

@job_id = @jobid,

@server_name = @servername
「已注销」 2010-09-27
  • 打赏
  • 举报
回复
1,为什么非要指定sql创建呢?
2,其实你第二点内部就有逻辑问题了,当你清空该表时,不也就是相当于第一次创建么?至少实质上是等价的。
3,....

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧