为并行执行循环作业的SQL脚本
问题描述:
我正在处理将使用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
答
更改您的while循环的条件,以检查是否有没有运行任何作业但今天。然后查询当前有多少个作业正在执行。如果超过10个执行等待延迟;否则,开始下一个工作。结束循环。
此外,您可能希望将此添加到您的工作查询的where子句。我以前一直在这个位。
WHERE a.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC)
按计划安排工作,并错开开始时间? – Jeremy
看起来您需要一个外部循环来继续重复内部循环,直到所有50个作业都运行完毕,并将循环控制更改为