2015-04-22 81 views
0

我正在处理将使用SSIS中的Attunity连接器将数据从ORACLE加载到SQL Server的进程。我需要加载大约50个表格,并为每个表格创建了一个作业,以便可以并行加载它们。基于服务器资源,我一次可以运行10个。我有一个脚本,我一直在工作,但它不能正常工作,因为它激发了10个工作并退出。我需要通过50个作业脚本循环(开始PS_),并只运行10为并行执行循环作业的SQL脚本

DECLARE @a int 
 
SET @a=0 
 
DECLARE @jobname nvarchar(200) 
 
-- checks if there are already 10 jobs running 
 
WHILE ((@a <10) and (
 
\t \t \t (SELECT count(*) FROM msdb.dbo.sysjobs a 
 
\t \t \t INNER JOIN msdb.dbo.sysjobactivity b 
 
\t \t \t \t ON a.job_id = B.job_id 
 
\t \t \t WHERE Start_Execution_date is not null 
 
\t \t \t AND Stop_Execution_Date is null 
 
\t \t \t AND substring (name, 1,3) = 'PS_')<= 10)) 
 
BEGIN 
 
\t SET @jobname = NULL 
 
\t --loops through to fetch one non-running job at a time and fetches upto 10 jobs 
 
\t SELECT TOP 1 @jobName = name 
 
\t FROM msdb.dbo.sysjobs X 
 
\t WHERE substring (x.name, 1,3) = 'PS_' 
 
\t AND 
 
\t --checks the job did not already run today and is currently running. 
 
\t name IN (
 
\t \t \t SELECT name FROM msdb.dbo.sysjobs C 
 
\t \t \t LEFT OUTER JOIN (select max(start_execution_date) Start_Execution_date ,job_id 
 
\t \t \t \t \t \t \t from msdb.dbo.sysjobactivity 
 
\t \t \t \t \t \t \t group by job_id) B 
 
\t \t \t ON B.job_id=C.Job_ID 
 
\t where cast(isnull(Start_Execution_date,'01/01/1900') as date) < cast(getdate()as date)) 
 
\t SELECT @jobname 
 

 
\t IF (@jobname is not null) 
 
\t \t BEGIN 
 
\t \t \t EXEC msdb.dbo.sp_start_job @[email protected] 
 
\t \t \t --select @jobname 
 
\t \t END 
 
\t \t WAITFOR DELAY '00:00:02' 
 
\t \t SET @[email protected]+1 
 
END

+0

按计划安排工作,并错开开始时间? – Jeremy

+0

看起来您需要一个外部循环来继续重复内部循环,直到所有50个作业都运行完毕,并将循环控制更改为<50。 –

回答

0

更改您的while循环的条件,以检查是否有没有运行任何作业但今天。然后查询当前有多少个作业正在执行。如果超过10个执行等待延迟;否则,开始下一个工作。结束循环。

此外,您可能希望将此添加到您的工作查询的where子句。我以前一直在这个位。

WHERE a.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)