我有一个SQL作业,我一直试图配置在一定时间(下午4点到晚上7点)之间运行。 我创建了我想在这段时间之间运行的工作(让我们称之为DynJob)。我将它设置为我希望它运行的日期的默认计划,默认时间值为下午4点。
但我不希望它每次运行时都在下午4点运行。 我希望它在下午4点到晚上7点之间运行。
所以我创造了另一份工作(SJob)。这项工作在下午2点运行(比DynJob的预定开始时间提前2小时)。所有SJob都会对dbo.sysjobschedules运行查询,并进行一些数学运算以得出介于160000和190000之间的值,并将该值插入到schedule_id = DynJob的调度ID的next_run_time字段中。
它有效(不是真的)。它会调整表中的时间,我可以看到它得到一个值(比方说175691)。但是,一切都不是。因为当下午4点到来时,DynJob仍然会运行。然后SQL将DynJobs next_run_time设置为运行后的下午4点(160000)。
我是不是错了? 是否有更简单的方法为时间窗设置作业时间表而不是一个静态时间?
以下是我在上面讨论过的TSQL。
USE [msdb]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
DECLARE @CallTime int = 1
DECLARE @MaxTime int = 30000
SET @CallTime = @MaxTime*RAND() + 160000
UPDATE dbo.sysjobschedules
SET next_run_time = @CallTime
WHERE schedule_id = 1
一如既往,感谢您抽出宝贵的时间!
P.S。是的,我知道有2个工作和2个时间表只是为了让这个工作是愚蠢的,但我是一个新手,并不知道SQL Server代理的方式:)所以任何答案,或有用的文档总是受到赞赏!如果这是愚蠢的,告诉我!但也要解释一下
答案 0 :(得分:0)
在sp_update_schedule存储过程中找到了我的解决方案。使用一个运行此存储过程的作业来生成和更新其他作业的计划,我开始使用它。
唯一棘手的部分是确保您获得正确的配置时间,并且您在运行sp_update_schedule过程的作业中使用了正确的权限...
“只有sysadmin的成员才能修改其他用户拥有的计划。”