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