【问题标题】:How can I perform one transaction per input row?如何为每个输入行执行一项事务?
【发布时间】:2013-03-27 20:46:46
【问题描述】:

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

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

据我所知,它的工作方式是脚本处理每个输入行并将所有内容输出到缓冲区,然后再继续执行更新命令。相反,我希望在每行的基础上执行所有更新,并在处理和更新每个输入行时提交更改。

如何构建我的数据流来实现这一点?

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

【问题讨论】:

    标签: ssis ssis-2008


    【解决方案1】:

    我怀疑唯一的方法是将所有内容(包括更新)放在一个脚本中。 SSIS 没有公开足够多的数据流缓冲策略来为您提供良好的控制水平。事实上,它不遗余力地在管道中加快速度,这与您正在寻找的节流策略正好相反。 (请参阅 MSDN 上的 Data Flow Performance Features,了解可用的调优功能的讨论。)

    或者,您可以构建一个完全自定义的目标管道组件。鉴于在 SSIS 2008 中调试脚本组件是多么痛苦,这甚至可能是一种更可取的方法。

    【讨论】:

    • 感谢您提供的信息,但是,我决定改变我的策略并将所有内容移到一个包含多个输出的脚本中。我完全改变了我的问题,我想你是在回答我之前的问题。
    【解决方案2】:

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

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

    这会输入到我的脚本中。

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

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 2016-03-24
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多