【问题标题】:SSIS flat file insertion failure to rollbackSSIS 平面文件插入失败回滚
【发布时间】:2010-03-12 06:03:10
【问题描述】:

我有一个简单的 SSIS 包,它从平面文件中读取数据并插入 SQL 数据库。该文件有 90K 行,有时由于错误的数据包失败,但它在失败之前插入了部分记录。我需要的是,如果插入在两者之间的任何时间失败,则不应将记录插入数据库,回滚所有内容。 我怎样才能把它放在交易中?

【问题讨论】:

    标签: ssis


    【解决方案1】:

    谢谢大家。最后我得到了答案。 据我实验有两种方法 1.使用交易选项,但我在这里遇到了问题。这需要您的 MSDTC 服务正在运行,并且由于某些问题,我的 SQl 管理员无法让它为我运行,所以我想到了替代方案。 2.使用SQL服务器事务。我使用了两个 SQL 任务,一个用于 BEGIN TRANSACTION,另一个用于 COMMIT TRANSACTION。为了使它工作,我需要将我的 SQL 连接管理器的属性“RetainSameConnection”设置为 True。这解决了我的问题。

    【讨论】:

      【解决方案2】:

      您是否在要进行事务的包或容器上设置了 TransactionOption?单击容器(或控制表面以选择整个包)并按 F4。确保有问题的容器设置为 TransactionOption 的必需,或者包设置为必需并且其中的容器设置为支持。可用的 TransactionOption 值如下:

      NotSupported 指定不会为此容器启动任何事务,因此,当前事务的结果(如果已由父容器启动)不会影响可能被在执行此容器期间更改。这意味着即使父容器启动了事务,更改也不会回滚。
      必需指定此容器将导致启动新事务,除非父容器已经有事务,在这种情况下,将加入父事务。
      支持 指定此容器不会启动事务。但是,如果父容器启动了一个事务,它将参与事务。这是默认设置。

      上面的 TransactionOption 值位于:
      http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtstransactionoption.aspx

      【讨论】:

        【解决方案3】:

        更好的方法,(或者至少我会怎么做,不一定更好)是在平面文件读取部分添加一些数据检查。确保为 VarChar、numeric 等正确定义了变量。这样它会在读取而不是插入时捕获它。

        您还可以在读取和插入之间添加一些脚本检查。

        另一种选择是将数据插入临时表,然后运行 ​​SQL 语句,该语句在插入生产表时使用事务。

        【讨论】:

        • 是的,这就是 SSIS 的本质。有 42 种不同但有效的方法可以在 SSIS 中做任何你想做的事情。
        猜你喜欢
        • 1970-01-01
        • 2013-05-02
        • 2015-01-22
        • 2010-12-23
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多