2014-04-08 46 views
1

大約在我的SSIS包中途有一個執行SQL任務調用SQL服務器上的存儲過程。該存儲過程包含一個事務並更新某些記錄,沒有存儲過程的輸出。如果在此存儲過程中遇到錯誤,事務將回滾。根據SQL結果停止執行

我無法弄清楚如何處理我的SSIS包,如果存儲過程中的事務遇到問題並回滾。

什麼是最好的方法來做到這一點?我可以添加一些邏輯到存儲過程輸出成功或失敗,但是我沒有看到的是如何在SSIS中使用它來停止處理。

+0

當你說停止。如果存儲過程中的事務觸發了一個錯誤並被回滾,那麼是否可以讓包失敗(因爲程序包將停止)? –

回答

2

在您的存儲過程中,確保回滾事務並在事件發生時引發錯誤。這樣任務將失敗,ssis包將失敗並停止執行。

Begin Try 
     Begin Tran deff 
      Update [test].[dbo].[User2] 
      Set [Password]='abc' 
      Where [User_ID]='abc' 
     Commit Tran deff 
    End Try 

Begin Catch 
IF XACT_STATE() <> 0 

    ROLLBACK TRANSACTION 
    RAISERROR ('Transaction Rolled Back', 16, 1) 

End Catch 
2

以下步驟可能對您有所幫助。

  1. 創建存儲過程,其存儲在成功/失敗消息的輸出變量。
  2. 創建SSIS變量存儲從執行SQL任務
  3. 配置輸出執行SQL任務存儲output parameter
  4. 拖動Script task到控制流
  5. 添加您在步驟創建的SSIS變量2作爲ReadOnlyVariables
  6. 按此Edit Script
  7. 以下代碼中Public void Main()方法

    粘貼
    //Change the variable name based on your SSIS package variable 
        var sprocMessage = Dts.Variables["SprocOutout"].Value.ToString(); 
    
        if (sprocMessage=="failure") 
        { 
         Dts.Events.FireError(0, "SP failed", "SP failed and rolled back", string.Empty,0); 
        } 
    
        Dts.TaskResult = (int)ScriptResults.Success; 
    

希望它有幫助!

+0

我還想使用這樣的事情來捕獲我使用RAISERROR語句時存儲在過程中的失敗消息。我已經在我的存儲過程中定義了一個輸出變量。我想我缺少一些設置輸出參數的東西,並沒有正確設置它。我使用了上面的第一個答案來使我的任務失敗,但似乎無法將來自SQL的輸出傳遞到我的電子郵件消息體中。 – Baub