【发布时间】:2010-03-12 06:03:10
【问题描述】:
我有一个简单的 SSIS 包,它从平面文件中读取数据并插入 SQL 数据库。该文件有 90K 行,有时由于错误的数据包失败,但它在失败之前插入了部分记录。我需要的是,如果插入在两者之间的任何时间失败,则不应将记录插入数据库,回滚所有内容。 我怎样才能把它放在交易中?
【问题讨论】:
标签: ssis
我有一个简单的 SSIS 包,它从平面文件中读取数据并插入 SQL 数据库。该文件有 90K 行,有时由于错误的数据包失败,但它在失败之前插入了部分记录。我需要的是,如果插入在两者之间的任何时间失败,则不应将记录插入数据库,回滚所有内容。 我怎样才能把它放在交易中?
【问题讨论】:
标签: ssis
谢谢大家。最后我得到了答案。 据我实验有两种方法 1.使用交易选项,但我在这里遇到了问题。这需要您的 MSDTC 服务正在运行,并且由于某些问题,我的 SQl 管理员无法让它为我运行,所以我想到了替代方案。 2.使用SQL服务器事务。我使用了两个 SQL 任务,一个用于 BEGIN TRANSACTION,另一个用于 COMMIT TRANSACTION。为了使它工作,我需要将我的 SQL 连接管理器的属性“RetainSameConnection”设置为 True。这解决了我的问题。
【讨论】:
您是否在要进行事务的包或容器上设置了 TransactionOption?单击容器(或控制表面以选择整个包)并按 F4。确保有问题的容器设置为 TransactionOption 的必需,或者包设置为必需并且其中的容器设置为支持。可用的 TransactionOption 值如下:
NotSupported 指定不会为此容器启动任何事务,因此,当前事务的结果(如果已由父容器启动)不会影响可能被在执行此容器期间更改。这意味着即使父容器启动了事务,更改也不会回滚。
必需指定此容器将导致启动新事务,除非父容器已经有事务,在这种情况下,将加入父事务。
支持 指定此容器不会启动事务。但是,如果父容器启动了一个事务,它将参与事务。这是默认设置。
上面的 TransactionOption 值位于:
http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.dts.runtime.dtstransactionoption.aspx
【讨论】:
更好的方法,(或者至少我会怎么做,不一定更好)是在平面文件读取部分添加一些数据检查。确保为 VarChar、numeric 等正确定义了变量。这样它会在读取而不是插入时捕获它。
您还可以在读取和插入之间添加一些脚本检查。
另一种选择是将数据插入临时表,然后运行 SQL 语句,该语句在插入生产表时使用事务。
【讨论】: