关于定时执行的一个问题。

wangkun9999 2008-11-19 02:56:58
表1:
id shzt EndTime
1 0 2008-11-19 15:58:37
2 0 2008-11-24 06:12:00
3 0 2008-11-24 14:28:05
....

请教各位高手,sql server中当gedate()=EndTime执行语句:
updat 表1 set shzt=1 where EndTime>=getdate()

EndTime都不相同,我的意思是每到一个时间点就触发相应记录的shzt置1;
如当前时间等2008-11-19 15:58:37时间点把id=1的记录置1;
如当前时间等2008-11-24 14:28:05时间点把id=3的记录置1;
...

这个能用一个作业或者触发器搞定吗?

...全文
131 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
无心雨云 2008-11-19
  • 打赏
  • 举报
回复
mark
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
作业也只是调用sql语句,只要存储过程和sql语句能够执行的作业也都能执行
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
你可以用sqlserver手动生成一个作业然后把脚本导出来,写道程序中去,类似

USE [msdb]
GO
/****** 对象: Job [s] 脚本日期: 11/19/2008 15:59:48 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** 对象: JobCategory [[Uncategorized (Local)]]] 脚本日期: 11/19/2008 15:59:48 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'ss',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'无描述。',
@category_name=N'[Uncategorized (Local)]',
@owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** 对象: Step [s] 脚本日期: 11/19/2008 15:59:48 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'ss',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_success_step_id=0,
@on_fail_action=2,
@on_fail_step_id=0,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'select getdate()', --此处sql语句
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'ex',
@enabled=0,
@freq_type=1,
@freq_interval=0,
@freq_subday_type=0,
@freq_subday_interval=0,
@freq_relative_interval=0,
@freq_recurrence_factor=0,
@active_start_date=20081119, --此处日期
@active_end_date=99991231,
@active_start_time=155920, --此处时间
@active_end_time=235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
wangkun9999 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jinjazz 的回复:]
sqlserver agent也是后台服务,稳定不稳定只是个人能力的问题了,服务器重启如果自己写服务器动不了sql的一样也启动不了。

作业是可以用脚本添加,但是如果你数据很多的话就麻烦了。
[/Quote]

作业多可以用另外一个作业来定时删除程序产生已经垫完的作业吗?
wangkun9999 2008-11-19
  • 打赏
  • 举报
回复
非常感谢 jinjazz,帮我看下14楼的需求可否可行?


wangkun9999 2008-11-19
  • 打赏
  • 举报
回复
现在我主要是想完全在数据库层实现这样一个需求,描述一下:

同时生成两个作业:
1.定时更新数据库作业:由程序控制生成,每增加一条数据库记录,就产生一个新的作业,用于控制到某一时间点执行置标志语句(每个作业只执行一次);
2.定时删除1的作业:这个可以定时去执行,主要是控制上面已经执行完的作业。

不知道这个在sql server里面可行否,高手进...
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
sqlserver agent也是后台服务,稳定不稳定只是个人能力的问题了,服务器重启如果自己写服务器动不了sql的一样也启动不了。

作业是可以用脚本添加,但是如果你数据很多的话就麻烦了。
wgl666666 2008-11-19
  • 打赏
  • 举报
回复
学习
wangkun9999 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jinjazz 的回复:]
当然是写windows服务后台运行了
[/Quote]

服务后台不是很稳定,最主要的是要把这个服务程序时刻都开着,遇上服务器重启就更麻烦了;

我在想用没有办法用程序控制生成数据库作业的方法,思路是这样的,不知可行否:
1.数据库添加记录的同时用程序自动生成一个数据库作业(用触发器实现,增加记录的时候触发,作业是定时间执行的);
2.作业时间点以后自动删除(也就是自己删除自己)。

sql server不是学得很好,不知可行否?各位老大来帮忙看看,谢谢!
landilan 2008-11-19
  • 打赏
  • 举报
回复
主要是看你的数据时间间隔,用job或服务,有一个运行时间间隔
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
服务开启一个线程,定时轮询这个表,发现有快要到期的任务就扔到一个临时任务队列中,另外一个线程不停的从这个队列中获取任务更新数据
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
当然是写windows服务后台运行了
wangkun9999 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jinjazz 的回复:]
如果你要精确到2008-11-19 15:58:37这个时候作业是无法完成的,只能通过自己写程序来做后台轮询了。
[/Quote]

老大是net版的老熟人了,是不是sql server数据库里面没有这样的实现方法?
那你可否告诉我在程序里面怎么做,这个时间段可是很长的,不可能用ajax吧?
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
没有
wangkun9999 2008-11-19
  • 打赏
  • 举报
回复
老大,你说的作业我也会,不过我这个调度比较特殊:
简单一点就是我这个调度是根据EndTime来实现的,时间点在EndTime字段里面(是活动的,不是死的定时)。

有没有一种触发器可以根据EndTime的时间点和当前时间对比来触发?
百年树人 2008-11-19
  • 打赏
  • 举报
回复
记录不多的话,可以考虑每个记录创建一个作业
jinjazz 2008-11-19
  • 打赏
  • 举报
回复
如果你要精确到2008-11-19 15:58:37这个时候作业是无法完成的,只能通过自己写程序来做后台轮询了。
flairsky 2008-11-19
  • 打赏
  • 举报
回复
只要逻辑没问题,定时器就没问题
水族杰纶 2008-11-19
  • 打赏
  • 举报
回复
定时作业的制定 

企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
EXEC 存储过程名 ... --该存储过程用于创建表

--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.

22,206

社区成员

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

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