如何避免在控制流中复制逻辑

时间:2013-03-11 14:22:19

标签: sql-server-2005 ssis

我有一个看起来如下的包:

SSIS

注意我用红色矩形标记的两个区域:它们在各方面都是相同的。我可以对包进行更改,以避免重复吗?在我看来,我无法将它们移动到数据流任务,因为那里不存在循环和文件系统任务。

3 个答案:

答案 0 :(得分:0)

只需将来自“select batch logins”任务的查询放入记录集,然后在该记录集上创建另一个foreach循环,从变量执行这两个查询。 我可以看到,在你的第二个foreach循环中有一些额外的任务,所以你将它们以某种方式将它们合并到“选择所有批处理登录”任务,或者制作在两个循环中都匹配的约束。

答案 1 :(得分:0)

另一种方法是添加一个'动作'列到您的批次'表。 (或添加支腿表)。预先计算 您要对记录执行的操作。然后只删除一次记录和文件。

您好像在这里进行RBAR操作。

因此,例如,您针对表运行几个UPDATE语句,使表处于每个记录被标记为删除的状态。

之后,您将完成循环并根据表格中的内容进行删除。

它会使你的包更简单。你可以加入一些“提交”#39;确保记录和文件始终同时删除的逻辑。

答案 2 :(得分:0)

你可以像@Bill提到的那样为循环逻辑创建一个子包,并且“将查询的结果集传递给另一个包”的方法如下(使用SSIS 2012作为示例,我做了类似的工作SSIS 2005,所以你只需要将c#代码更改为vb.net)

  1. 在父包中,创建一个变量以保存父包中 resultSet 变量的名称: enter image description here

  2. 在子包中,创建一个字符串变量 parentResultSetName enter image description here

  3. 在子包中,添加包配置以将 parentResultSetName 映射到父包变量 resultSetVariableName enter image description here

  4. 现在,我们可以通过子包的脚本任务中的名称读取 resultSet 变量:

    public void Main()
    {
        // TODO: Add your code here
    
        var dsName = Dts.Variables["parentResultSetName"].Value.ToString();
        Variables variables = null;
    
        DataSet resultSet = null;
    
        Dts.VariableDispenser.LockForRead(dsName);
        Dts.VariableDispenser.GetVariables(ref variables);
    
        try
        {
            resultSet = variables[dsName].Value as DataSet;
    
            if (resultSet != null)
            {
                MessageBox.Show("Sub package get: " + resultSet.Tables[0].Rows[0][0].ToString());
            }
    
            Dts.TaskResult = (int)ScriptResults.Success;
        }
        catch (Exception e)
        {
            Dts.Events.FireError(-1, "", e.Message, "", 0);
        }
    }
    
  5. 结果如下: enter image description here