SSIS对象变量计数?

时间:2011-12-16 16:50:36

标签: sql sql-server-2008 ssis bids

我在BIDS 2008中使用SSIS,我正在尝试计算包含文件列表的对象变量。关于如何做到这一点的任何想法?

谢谢!

3 个答案:

答案 0 :(得分:3)

您如何填充此对象变量?根据您填充变量的方式,可以列出更多的获得计数的方式。但是,这是一个快速而肮脏的解决方案:

  1. 创建一个integer类型的新变量,并将该变量初始化为0
  2. 使用foreach循环任务迭代对象(打开foreach循环编辑器,转到Collections并将枚举器更改为Foreach ADO Enumerator,将ADO对象源变量更改为Object变量。
  3. 创建Execute SQL Task
  4. 在常规选项卡上,将ResultSet设置为Single row,将sql语句设置为SELECT (@Count + 1)
  5. 在“参数映射”选项卡中,添加新的整数变量并将Parameter Name属性更改为@Count
  6. 在“结果集”选项卡中,添加一个名称为0的新条目和变量名称:新创建的整数变量。
  7. 循环完成后,您将获得对象的计数。

    注意:如果您已经在遍历这些文件(我假设您使用SSIS来填充带有文件名的对象变量),则只需执行步骤1,3-6。

答案 1 :(得分:1)

您是否有理由不仅使用脚本任务?

给定两个SSIS变量,MyObject(类型Object)和MyObjectCount(Int32)设置为10.

脚本任务1填充对象。

    // Nothing clever, just fills a List<T> with 
    // MyObjectCount's worth of values.
    public void Main()
    {
        int count = (Int32)Dts.Variables["User::MyObjectCount"].Value;
        List<bool> obj = new List<bool>();
        for (int i = 0; i < count; i++)
        {
            obj.Add(false);
        }

        Dts.Variables["User::MyObject"].Value = obj;
        Dts.TaskResult = (int)ScriptResults.Success;
    }

脚本任务2只是将SSIS变量MyObject的值分配给一个局部变量,我将其转换为适当的类型。我将这个数字与我的参考计数进行比较,它们是相同的。

    public void Main()
    {
        int refCount = (Int32)Dts.Variables["User::MyObjectCount"].Value;
        List<bool> obj = Dts.Variables["User::MyObject"].Value as List<bool>;
        int actualCount = obj.Count;
        string message = string.Format("Reference count: {0}. Actual count {1}", refCount, actualCount);

        bool fireAgain = false;
        Dts.Events.FireInformation(0, "Accessing count", message, string.Empty, 0, ref fireAgain);
        Dts.TaskResult = (int)ScriptResults.Success; Dts.TaskResult = (int)ScriptResults.Success;
    }

结果

[访问计数]信息:参考计数:10。实际计数10

如果您不对将对象推入SSIS变量的内容负责,那么您可能需要将上述提取包装到一系列try / catch块中或将其作为一种类型转换,直到找到运行的内容为止 - 时间可以转换为强类型对象。

答案 2 :(得分:0)

我的处理方式是,请记住我已经有一个 ForEachLoop 容器,可以循环遍历 excel 文件。

  1. 创建了 DataType=INT Value=1 的计数变量
  2. 将表达式任务拖到我的数据流下方并附加优先级
  3. 在表达式任务中插入这个函数
@[User::Count] = @[User::Count] + 1

文件每次循环时,Count 变量都会增加 1。 希望这可以帮助任何搜索此问题的人。