我在BIDS 2008中使用SSIS,我正在尝试计算包含文件列表的对象变量。关于如何做到这一点的任何想法?
谢谢!
答案 0 :(得分:3)
您如何填充此对象变量?根据您填充变量的方式,可以列出更多的获得计数的方式。但是,这是一个快速而肮脏的解决方案:
Collections
并将枚举器更改为Foreach ADO Enumerator
,将ADO对象源变量更改为Object变量。Execute SQL Task
SELECT (@Count + 1)
Parameter Name
属性更改为@Count 循环完成后,您将获得对象的计数。
注意:如果您已经在遍历这些文件(我假设您使用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 文件。
@[User::Count] = @[User::Count] + 1
文件每次循环时,Count 变量都会增加 1。 希望这可以帮助任何搜索此问题的人。