如何在每个输入行执行一个事务?

时间:2013-03-27 20:46:46

标签: ssis ssis-2008

我有一个带有oledb数据源的数据流。然后我有一个执行三个Web服务调用的脚本组件,它有两个输出(实际上)与输入行同步(每个输入行一个输出行),一个输出是异步的(每个输入输出许多行)行)。每个输出都转到sql update命令。还有一个错误日志输出(也是异步)。

我希望以某种方式将输出包装在事务中,以便对于每个输入行,如果未完全处理和更新该行,则该输入行的所有更新都不会成功。

据我所知,其工作方式是脚本处理每个输入行并将所有内容输出到缓冲区,然后再转到更新命令。我希望,而不是每行执行所有更新,在处理和更新每个输入行时提交更改。

如何构建数据流来实现此目标?

我正在考虑执行源代码,然后通过foreach容器运行记录,但我不确定如何通过ForEach容器将多个DataFlow链接在一起。

2 个答案:

答案 0 :(得分:0)

我怀疑唯一的方法是将所有内容(包括更新)放在一个脚本中。 SSIS没有公开足够的数据流缓冲策略来为您提供一定程度的控制。事实上,它在管道中加速处理需要很长时间,这与您正在寻找的限制策略正好相反。 (有关可用调优功能的讨论,请参阅MSDN上的Data Flow Performance Features。)

或者,您可以构建完全自定义的目标管道组件。考虑到SSIS 2008中调试脚本组件的痛苦程度,这甚至可能是一种更好的方法。

答案 1 :(得分:0)

这里的解决方案是我创建一个数据流任务,将用户选择到一个记录集中,该记录集放在一个变量中。

然后我使用For Each容器来读取记录集,并将用户名放在变量中。在For Each中,我有一个数据流,它有一个OLEDB源,它使用变量作为参数再次选择用户(这导致查找数据集的每次迭代,但没关系)。

这会反馈到我的脚本中。

此外,我在每个循环中的包之前和之后放置执行SQL任务,因此我不必使用DTC事务,并且可以将每个输入行作为单独的事务处理。