微软BI 之SSIS 系列 - For Loop 循环时间 和 Foreach Loop 循环处理文件

浏览: 5870

开篇介绍

几乎所有的编程语言中都有循环这样的一个概念,最常见的就是 for,while 等循环语句,在有的编程语言中也有 foreach 这样的遍历语法。

在 SSIS 中,也有这样的循环控件,它们本身不执行具体的操作,只是用来提供一个循环处理的逻辑空间供其它的任务流控件循环调用。这里我们要学习的就是 For Loop Container 与 Foreach Loop Container。这两者中 For Loop Container 要简单一些,但是真正用的最多的还是 Foreach Loop Container,下面就演示它们具体的使用方法。

For Loop Container

新建两个变量,一个表示初始值,一个表示循环终点对比的值。

选择 For Loop Container 并且编辑它的循环表达式,可以看到它的表达式和我们初学编程语言中的 for(int i=0;i<10; i++) 这种语法概念上完全是一样的,所以很容易理解。 

那么 For Loop 中到底可以做什么事情?这个完全取决于需求,可以在 For Loop 中调用 Data Flow,也可以调用 Execute SQL Task 循环执行一些操作。在这里演示使用 Script Task  读取一下循环中的变量,不做任何操作。

public void Main()
{
// TODO: Add your code here
// User::PV_END_VALUE,User::PV_INITIAL_VALUE
MessageBox.Show("Initial Value - " + Dts.Variables["User::PV_INITIAL_VALUE"].Value.ToString()
+ " End Value " + Dts.Variables["User::PV_END_VALUE"].Value.ToString());
Dts.TaskResult
= (int)ScriptResults.Success;
}

这样会执行 6次,直到条件不满足为止。 

除此之外,比较有用的是循环遍历时间的时候,可以用到 For Loop,可以结合 Execute SQL Task 做一些逻辑处理。

添加一个 Script Task 然后展现一下这个日期变量的变化。

public void Main()
{
// TODO: Add your code here
MessageBox.Show("The Date is " +
((DateTime)Dts.Variables[
"User::PV_INITIAL_DATE"].Value).ToLocalTime());
Dts.TaskResult
= (int)ScriptResults.Success;
}

第一次 - 

和今天最后一次 - 

比如有需求需要处理一段周期内的数据,需要使用到循环的时候就可以借助 For Loop 来完成循环的逻辑处理,参数是循环中的这个日期,日期可以通过存储过程中的参数或者查询语句中的参数传递。

Foreach Loop Container

Foreach Loop Container 使用的最多的就是循环遍历文件的操作,比如我们需要加载一批可能几十个或者上百个文本文件的数据到数据库中。这些文本文件的格式都是一样的,只不过数据内容不一样,那么这时就最适合使用 Foreach Loop Container 来遍历加载文本文件了。

比如在源输入文件夹中存在这么一批文件,都是员工信息,它们的文件格式都一样。

如果像以前一样单一的去加载那么就需要创建 7 个平面链接管理器和 7个数据流任务,并且所有的配置都得来 7 遍,所以这个肯定是不合适的。

新建一个 Foreach Loop Container,编辑它并选择 Foreach File Enumerator。在遍历的目录中指定路径,并同时指定只加载 .txt 类型的文件。

在 Variable Mappings 中新建一个变量,这个变量将用来保存遍历文件的文件路径。

这样每次读取一个文件,文件的链接信息就保存在这个变量中了。

为了测试,我们在 Foreach Loop 容器中添加一个 Script Task 来显示一下这个变量的值。

 public void Main()
{
// TODO: Add your code here
MessageBox.Show(Dts.Variables["User::PV_EMPLOYEE_FILE"].Value.ToString());
Dts.TaskResult
= (int)ScriptResults.Success;
}

保存并执行包,可以看到这个变量的表示的文件路径,循环容器遍历到每一个 .txt 文件。

在 Foreach Loop Container 中 新建一个 Data Flow Task,我们要遍历所有文件并将数据加载到数据库中。由于源目录下所有的文件格式都一样,因此直接先选择其中任意一个文件建立好平面连接管理器,并实现数据输出的过程。

由于在循环遍历文件的过程中,每一次循环都可以获取一个文件的路径并保存在变量 PV_EMPLOYYE_FILE 中,因此需要更改链接管理器 CM_FF_EMPLOYEE 的文件链接表达式,这样每一次循环的时候 CM_FF_EMPLOYEE 指向的文件就不同了,那么每一次循环所获取的数据也就随着文件源发生改变而变化了。

保存并执行包,7个文件 Foreach Loop Container 循环 7 次, DFT_LOAD_EMPLOYEE 执行 7 次,每次的文件数据源链接都不相同。

每一个文件都是 290 条数据,7 个文件总共就是 2030 条数据。

推荐 0
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册