首页 > 解决方案 > SSIS 建议中的 Foreach 循环容器

问题描述

我的 SSIS 主包中有 for-each 循环容器在此“执行 SQL Server 代理作业任务”下有“执行包任务”。(它有 35 个步骤)

问题:SSIS 主包正在开始下一次迭代,但未完成“执行 SQL Server 代理作业任务”中的所有步骤。

请建议仅在完成所有步骤后开始下一次迭代的方法。

提前致谢 :)

标签: sql-serverssismsbi

解决方案


我知道我一直在 SSIS 问题上抛出 C# 解决方案,但这正是我为了防止作业/进程在作业运行时运行而做的。

我有一个执行此检查并返回布尔值真/假的函数。使用该结果来确定是否开始作业。

    public static bool isDatabaseUpdating()
    {
        List<string> jobs = new List<string>();

        jobs.Add("[Insert name of Job here]");
        jobs.Add("[Insert another job and so on here]");

        string sql = "exec msdb.dbo.sp_help_job @execution_status = 1";

        using (OleDbConnection conn = new OleDbConnection(cstr))
        {
            using (OleDbCommand cmd = new OleDbCommand(sql, conn))
            {
                cmd.CommandType = CommandType.Text;
                cmd.Connection.Open();
                OleDbDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    if (jobs.Contains(rdr["name"].ToString())) return true;
                }
            }
        }

        return false;
    }

要使用它,请像这样设置一个 SSIS 变量:

Dts.Variables["@variableName"].Value = isDatabaseUpdating();

然后在控制流中适当地设置路径上的表达式。

理解这个函数的真正关键是 SQL。

exec msdb.dbo.sp_help_job @execution_status = 1

这将返回当前正在运行的作业数据集。

增强您的应用程序

这就是您的控制流的样子:

在此处输入图像描述


推荐阅读