1

我有一个如下所示的包:

SSIS

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

4

3 回答 3

0

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

  1. 在您的父包中,创建一个变量来保存父包中resultSet变量的名称: 在此处输入图像描述

  2. 在您的子包中,创建一个字符串变量parentResultSetName在此处输入图像描述

  3. 在您的子包中,添加包配置以将parentResultSetName映射到父包变量resultSetVariableName在此处输入图像描述

  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. 结果如下: 在此处输入图像描述

于 2013-03-14T10:05:32.750 回答
0

另一种方法是在“批次”表中添加“操作”列。(或添加一个支腿表)。事先确定想对记录做什么。然后只需删除一次记录和文件。

看起来你在这里做RBAR操作。

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

然后,您通过循环并根据表中的内容进行删除。

它会让你的包裹更简单。并且您可以合并一些“提交”逻辑,以确保始终同时删除记录和文件。

于 2013-03-11T22:52:56.677 回答
0

只需将您的查询从“选择批量登录”任务放到记录集,然后在该记录集上进行另一个 foreach 循环,从变量执行这两个查询。我可以看到在您的第二个 foreach 循环中还有一些额外的任务,因此您将以某种方式将它们合并到“选择所有批量登录”任务中,或者使约束在两个循环中都匹配。

于 2013-03-11T15:38:41.480 回答