2016-11-14 94 views
0

我在SSIS中有一個包含多個任務的包。我正在加載文件,如果最後的文件系統任務失敗,我希望能夠回滾事務。我的包看起來就像那樣。 general_package 我喜歡能夠回滾SSIS腳本已完成的所有操作。爲此,我需要SSIS腳本來登記由BEGIN_TRANSACTION Sql任務創建的事務。我該怎麼做?SSIS腳本任務在當前事務中登記

在SSIS收集交易我做的:

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:真

感謝您的想法

文森特

回答

0

在你的包看,我看你是通過一堆文件和每個迭代迭代,您將文件內容加載到目標表中。 您希望您的所有數據加載都是原子的,即完全加載或完全加載。

考慮到這一點,我想提出以下方法,並在所有這些appraoches的沒有必要使用腳本任務或開始/結束事務塊明確的 -

  1. 使用數據流任務和在屬性中設置TransactionOption爲Required。這將完成在塊上啓用交易的工作
  2. 在目的地將錯誤重定向以分批方式發送到錯誤表,以便將錯誤降至最低可能的最小值(例如 - http://agilebi.com/jwelch/2008/09/05/error-redirection-with-the-ole-db-destination/) 。我們在每天執行超過百萬的數據加載時成功地使用了100k,50k,1作爲3個批次。然後您可以單獨處理這些錯誤。
  3. 如果用例使整個數據都失敗,那麼只需重定向失敗的記錄。使用文件系統任務(FST)將記錄移動到'失敗'文件夾。在FST之後有一個DFT在目標上執行查找,然後刪除所有這些記錄。
+0

嗨,感謝您的回答我不使用數據流的原因是該軟件包用於不同的表結構不同,數據流不能有列的通用元數據 –

+0

您可以提供更多詳細信息或示例你的意思是不同的表格有不同的結構?你想要解決什麼樣的用例? – VKarthik

0

所以我找到了一個解決方案。 在第一腳本塊(提取物和負載)1創建一個事務與此代碼:

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(); 

其結果是,如果一個文件不能被移動到存檔文件夾我不明白負荷的兩倍,交易很火的每個文件,所以如果一個文件不能只多關於這個文件的數據得到回滾,並且枚舉器繼續前進到下一個。