2016-07-06 116 views
0

我们有一个4小时的数据仓库作业,每4小时运行一次,时间为4小时。我们希望创建一个新的“每日”时间表并让一些流程耗时数小时。SQL Server代理作业依赖关系

然而,如果在日常工作来运行,而4小时作业仍在运行,我想它等待4小时作业完成,然后运行(或者指定的持续时间)。我还没有决定哪个最好......

这怎么可能?谢谢!

请不要建议第三方选项,因为我无法控制基础设施。

+0

当SQL代理作业运行,同样的工作,不会再次运行,即使它计划运行 – TheGameiswar

回答

1

请将所有工作细节保存在一张表中,包括工作状态,即正在进行,已完成。当日常工作运行时,你必须检查第四项工作是否成功完成,然后开始你的日常工作,并在第四项工作完成后触发你的日常工作。

create TABLE [dbo].[tblDailyJob](
    [JobId] [int] NOT NULL, 
    [JobDesc] [varchar](500) NOT NULL, 
    [JobStartTime] [datetime] NULL, 
    [JobEndTime] [datetime] NULL, 
    [JobStatus] [int] NOT NULL, 
CONSTRAINT [PK_tblDailyJob] PRIMARY KEY CLUSTERED 
(
    [JobId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[tblDailyJob] ADD CONSTRAINT [DF_tblDailyJob_JobStatus] DEFAULT ((0)) FOR [JobStatus] 
GO 

工作状态 - 0未开始,1在进步,2已完成,3失败

insert into tblDailyJob values(1,'1st Job',null,null,0) 
insert into tblDailyJob values(2,'2nd Job',null,null,0) 
insert into tblDailyJob values(3,'3rd Job',null,null,0) 
insert into tblDailyJob values(4,'4th Job',null,null,0) 
insert into tblDailyJob values(5,'Daily Job',null,null,0) 

集excecuting工作时间和结束时间和作业状态作业完成之后才开始时间

第四作业完成后,触发您的日常作业,或者如果你是触发它手工然后检查第四作业完成与否

你也可以使用任务程序器的相同。

+0

您好感谢你有什么这会是什么样的例子? – jhowe

0

看看sp_getapplock。实质上,您可以创建自己的锁,该锁遵守所有正常的SQL Server锁定语义。在你的情况下,你可以说“等到我可以获得这个锁之前继续”。