2011-12-16 41 views
2

我在BIDS 2008中使用SSIS,我试图获取包含文件列表的对象变量的计数。任何想法如何做到这一点?对象变量的SSIS计数?

谢谢!

+0

一个类型为Object的SSIS变量已经被分配了一些暴露Count属性的东西,并且你想获得该值? – billinkc 2011-12-16 17:20:53

+0

是的,我想获得这个价值,但我不知道如何。 – buzzzzjay 2011-12-16 17:28:31

回答

3

你是如何填充这个对象变量的?根据您如何填充变量,可以列出获取计数的更多合适方法。然而,这里是你一个快速和肮脏的解决方案:

  1. 创建整数类型的新变量,变量初始化为0
  2. 使用foreach循环任务来遍历你的对象(打开foreach循环编辑器,去Collections,改变枚举Foreach ADO Enumerator和ADO对象源变量对象变量。
  3. 创建Execute SQL Task
  4. 在常规选项卡,设置的ResultSet单列和你的SQL语句SELECT (@Count + 1)
  5. 在参数映射选项卡中,添加新的整数变量并将Parameter Name属性更改为@计数
  6. 在结果集选项卡中,添加名称为0和变量名称为新创建的整数变量的新条目。

一旦你的循环完成,你将有计数的对象。

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

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块或将其转换为类型,直到找到运行时可将转换为强类型对象的东西。