SQL 2014中的动态作业调度

SQL 2014中的动态作业调度,sql,sql-server-agent,Sql,Sql Server Agent,我有一个SQL作业,我一直试图将其配置为在特定时间(下午4点到7点)之间运行。 我创建了我希望在这段时间内运行的作业(我们称之为DynJob)。我将它设置为一个默认时间表,其中包含我希望它运行的天数,默认时间值为4pm 但我不希望它每次运行都是在下午4点。 我希望它在下午4点到7点之间运行 所以我创造了另一份工作(SJob)。此作业在下午2点运行(比DynJob的计划开始时间早2小时)。SJob所做的就是对dbo.sysjobschedules运行一个查询,并进行一些数学运算,得出一个介于160

我有一个SQL作业,我一直试图将其配置为在特定时间(下午4点到7点)之间运行。 我创建了我希望在这段时间内运行的作业(我们称之为DynJob)。我将它设置为一个默认时间表,其中包含我希望它运行的天数,默认时间值为4pm

但我不希望它每次运行都是在下午4点。 我希望它在下午4点到7点之间运行

所以我创造了另一份工作(SJob)。此作业在下午2点运行(比DynJob的计划开始时间早2小时)。SJob所做的就是对dbo.sysjobschedules运行一个查询,并进行一些数学运算,得出一个介于160000和190000之间的值,然后将该值插入下一个运行时间字段,其中schedule\u id=DynJob的schedule id

而且它有效(不是真的)。它将调整表中的时间,我可以看到它得到一个值(比如175691)。但是,这一切都是为了不。因为下午4点到了,DynJob还是会跑。然后SQL将DynJobs下次运行时间设置为运行后的下午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
一如既往,感谢您抽出时间

另外,是的,我知道有两份工作和两个时间表只是为了让这项工作正常进行是愚蠢的,但我是一个新手,不知道SQL Server代理的方法:)因此,任何答案或有用的文档都是非常感谢的!如果这是愚蠢的,告诉我!但是也解释一下

在存储过程中找到了我的解决方案。使用一个运行此存储过程的作业来生成和更新其他作业的计划,我使其正常工作

唯一棘手的部分是确保您配置了正确的时间,并且在运行sp_update_schedule过程的作业中使用了正确的权限

“只有sysadmin的成员才能修改其他用户拥有的计划。”


您需要根据您的工作设置频率和/或持续时间。(它运行几个小时,还是在A和B小时之间运行多次?)有一些好信息。不,它将在A和B之间运行一次,但每周运行5天。我只希望A和B之间的时间是随机的。没有随机开始时间的功能。(DBA通常不喜欢让任务在随机时间启动。这不是我希望看到的。)所以我想问题是,为什么需要SQL代理来生成随机启动时间?(可能SQL代理是错误的工具,或者可能有更好的方法来实现您的最终目标。)我需要随机将文件发送到ftp服务器。一旦文件到达该服务器,一个进程就会获取该信息并使用该信息执行“x”。但是“x”不可能每天都在同一时间发生,否则整个过程的效率就会降低(不能透露更多)。文件发送到ftp服务器后,我无法控制。因此,我必须确保文件在我打算执行“x”时准确发送。因为“x”需要在4-7之间的随机时间发生,所以我必须合理地安排它。如果由我决定,我会使用一个可执行文件,但我必须为此使用SSIS包。哇,一组有趣的需求。非常不寻常。不管怎样,我认为你最初的想法可能是正确的。如果在sysjobschedules中更改下一个开始时间不太合适,那么调整第二个作业如何,以便不更改开始时间,而是删除或分离该计划,并向第一个作业添加/附加一个全新的计划?也许这会解决你目前技术上的任何问题。(您没有指定它不工作的原因。)