使用SSIS中的执行包任务动态执行多个包

时间:2016-06-27 12:25:21

标签: sql ssis packages ssis-2012 msbi

我试图动态执行多个包。

我在数据库中存储了一个用于存储包名称的表,并且每个表都有一个指示符作为' Y / N'。 我的最终目标是执行那些带有指标' Y'

我正在创建一个变量,该变量将所有包名称都包含在指标' Y'。

我在每个循环容器中使用a,我在其下放置了执行包任务。我在for循环中为每个循环分配一个ADO枚举器,并将我的变量分配给ADO对象源变量。

有没有办法在Execute包任务中使用属性表达式,我可以通过变量为包名分配,并在同一个解决方案中动态执行必要的包(子包)?

2 个答案:

答案 0 :(得分:2)

你的方法是正确的,只需要稍微调整一下 ExecutePackage Task具有属性 PackageName ,其中包含程序包的完整路径。对于SSISDB目录,当您从项目中调用包时,它只是一个包名。如果包存储在MSDB中,则它是'\\ Folder1 \\ Folder2 \\ Packagename'。您可以在表达式的帮助下设置 PackageName 属性(例如,如果需要,可以输入前缀包路径)。
小例子enter image description here

答案 1 :(得分:0)

是的 - 尽管如此,我对此问题的看法不同。这将调用SQL代理作业 - 作业的名称作为变量传入 - 这将由您的FOR ... LOOP填充。

  • 作业已执行
  • 我们监视sysjobactivity以检测它何时实际运行以及何时完成。
  • 一旦完成,我们会在sysjobhistory中查找最新的条目以查看状态是什么(在执行停止后,只有一个条目写入此表 - 如果我们立即检查,我们将获得最后的结果状态)

为了实现这一目标,您必须确信自己是唯一可能从事此项工作的用户 - 否则您可能会获得其他人的历史记录!

运行该作业的用户需要MSDB中的SQLAGENTOPERATORROLE。

    SET NOCOUNT ON;

DECLARE @job_name VARCHAR(100) = 'YOU_JOB_NAME_HERE'
EXEC msdb.dbo.sp_start_job @job_name = @job_name

WHILE EXISTS(
    SELECT 1 FROM msdb.dbo.sysjobs_view job
    INNER JOIN msdb.dbo.sysjobactivity activity ON job.job_id = activity.job_id
    INNER JOIN msdb.dbo.syssessions sess ON sess.session_id = activity.session_id
    INNER JOIN (SELECT MAX(agent_start_date) AS max_agent_start_date FROM msdb.dbo.syssessions) sess_max ON sess.agent_start_date = sess_max.max_agent_start_date
    WHERE job.name = @job_name  AND run_requested_date IS NOT NULL AND stop_execution_date IS NULL
)
BEGIN
    PRINT 'Running'
    WAITFOR DELAY '00:00:01'
END
PRINT 'Finished'

SELECT TOP 1 HIST.run_status
    -- 0=Failed, 1=Succeeded 2=Retry 3=Cancelled
FROM msdb.dbo.sysjobs JOB
INNER JOIN  msdb.dbo.sysjobhistory HIST ON HIST.job_id = JOB.job_id
WHERE JOB.name = @job_name
ORDER BY HIST.run_date, HIST.run_time