大約在我的SSIS包中途有一個執行SQL任務調用SQL服務器上的存儲過程。該存儲過程包含一個事務並更新某些記錄,沒有存儲過程的輸出。如果在此存儲過程中遇到錯誤,事務將回滾。根據SQL結果停止執行
我無法弄清楚如何處理我的SSIS包,如果存儲過程中的事務遇到問題並回滾。
什麼是最好的方法來做到這一點?我可以添加一些邏輯到存儲過程輸出成功或失敗,但是我沒有看到的是如何在SSIS中使用它來停止處理。
大約在我的SSIS包中途有一個執行SQL任務調用SQL服務器上的存儲過程。該存儲過程包含一個事務並更新某些記錄,沒有存儲過程的輸出。如果在此存儲過程中遇到錯誤,事務將回滾。根據SQL結果停止執行
我無法弄清楚如何處理我的SSIS包,如果存儲過程中的事務遇到問題並回滾。
什麼是最好的方法來做到這一點?我可以添加一些邏輯到存儲過程輸出成功或失敗,但是我沒有看到的是如何在SSIS中使用它來停止處理。
在您的存儲過程中,確保回滾事務並在事件發生時引發錯誤。這樣任務將失敗,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
以下步驟可能對您有所幫助。
output parameter
Script task
到控制流ReadOnlyVariables
Edit Script
以下代碼中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;
希望它有幫助!
我還想使用這樣的事情來捕獲我使用RAISERROR語句時存儲在過程中的失敗消息。我已經在我的存儲過程中定義了一個輸出變量。我想我缺少一些設置輸出參數的東西,並沒有正確設置它。我使用了上面的第一個答案來使我的任務失敗,但似乎無法將來自SQL的輸出傳遞到我的電子郵件消息體中。 – Baub
當你說停止。如果存儲過程中的事務觸發了一個錯誤並被回滾,那麼是否可以讓包失敗(因爲程序包將停止)? –