SSIS脚本任务在当前事务

时间:2016-11-14 04:38:01

标签: c# ssis sqlbulkcopy script-task

我在SSIS中有一个包含多个任务的包。我正在加载文件,如果文件系统任务最终失败,我希望能够回滚事务。我的包看起来像那样。general_package 我希望能够回滚SSIS脚本已完成的所有操作。为此,我需要SSIS脚本在BEGIN_TRANSACTION Sql任务创建的事务中登记。我怎么能这样做?

在收集交易的过程中我做了:

 object rawConnection = Dts.Connections["destination_ado"].AcquireConnection(Dts.Transaction);
             myADONETConnection = (SqlConnection)rawConnection;

然后我做了BulkCopy:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection))
                    {
                        sbc.DestinationTableName = "[" + SCHEMA_DESTINATION + "].[" + TABLE_DESTINATION + "]";
                        //  sbc.DestinationTableName = "test_load";
                        // Number of records to be processed in one go
                        sbc.BatchSize = 10000;


                        // Finally write to server
                        sbc.WriteToServer(destination);
                    }
                    myADONETConnection.Close();

如何告诉SqlBulkCopy使用现有的事务? 在SSIS中的连接选项中,我使用RetainSameConnection:true

感谢您的所有想法

文森特

2 个答案:

答案 0 :(得分:0)

查看您的软件包,我发现您正在迭代一堆文件,并且每次迭代都会将文件内容加载到目标表中。 您希望所有数据加载都是原子的,即完全加载或根本不加载。

考虑到这一点,我想建议以下方法,在所有这些appraoches中,不需要明确使用Script Task或Begin / End Transaction块 -

  1. 使用数据流任务并在属性中将TransactionOption设置为Required。这将完成在块上启用事务的工作
  2. 以分批方式在目标位置将错误重定向到错误表,以便将错误最小化到可能的最小值(例如 - http://agilebi.com/jwelch/2008/09/05/error-redirection-with-the-ole-db-destination/)。当每天数据量超过百万时,我们成功地使用了100k,50k,1作为3批次。然后,您可以单独处理这些错误。
  3. 如果用例是整个数据必须失败,那么只需重定向失败的记录。使用文件系统任务(FST)将记录移动到“failed”文件夹。在FST之后进行DFT以对目标执行查找,然后删除所有这些记录。

答案 1 :(得分:0)

所以我找到了解决方案。 在第一个脚本块(提取和加载)上,我使用以下代码创建一个事务:

SqlTransaction tran = myADONETConnection.BeginTransaction(IsolationLevel.ReadCommitted);

然后我以这种方式在SqlBulkCopy中使用此事务:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection,SqlBulkCopyOptions.Default,tran))

将事务对象传递给SSIS变量:

Dts.Variables["User::transaction_object"].Value = tran;

然后在我的两个块结尾提交事务和Rolloback事务我使用SSIS脚本,读取变量并提交或回滚事务:

SqlTransaction tran = (SqlTransaction)Dts.Variables["User::transaction_object"].Value;
tran.Commit();

因此,如果文件无法移动到Archive文件夹,我没有加载两次,则每个文件都会触发一个事务,所以如果一个文件不能再多,那么这个文件的数据就会得到回滚和调查员继续前往下一个。

相关问题