2013-01-31 13 views
1

我們有一個SSIS包,它通過EXECUTE SQL TASK組件調用存儲過程。存儲過程包含很多不同的sql代碼片段,這些代碼可以動態構建,然後通過存儲過程中的exec strSQL執行。整個系統是以這種方式構建的,現在我們不能重新設計。問題是,當存儲過程中的某些內容失敗時很難從SSIS中找出存儲過程中的SQL語句導致異常/失敗。我們現在正在工作的是包含onError事件的代碼,用於讀取System :: ErrorDescription,它有助於在SSIS中顯示錯誤,然後發送帶有錯誤的電子郵件,這是行得通的。我想要添加的是有一個系統變量或其他方式來顯示在SSIS中的實際SQL(導致存儲過程中的異常),我可以包括在電子郵件中。有任何想法嗎?謝謝。如何將導致存儲過程異常的SQL語句返回給SSIS

回答

1

我有一個解決方案。表變量不會回溯到catch塊和回滾語句中。

因此,在將sql語句放入具有nvarchar(max)數據類型的變量表中之前,先放入它們。確保您的proc使用try catch塊和事務。在catch塊中,如果需要的話執行回滾,然後將表變量的內容和日期時間插入到日誌表中。您是否記錄了確切運行的查詢。您也可以創建一個單獨的表來存儲您嘗試插入或更新的數據,如果這也是一個問題。

+0

感謝您的快速回復。有沒有辦法做到這一點,而無需回滾存儲過程中的事務?現在我們的代碼在存儲過程中沒有任何事務,而且我們的代碼在任何地方都沒有try catch語句,我知道應該改變它,但我試圖找到最簡單的方法來完成這個任務,爲此獲得批准。我如何從SSIS思想中讀取表變量?不知何故,我需要從表變量中獲取數據到SSIS(SSIS變量),以便我可以抓住sql並將其粘貼到電子郵件任務中。 – TuSabesTuSabes

+0

將其添加到proc並插入到permananent日誌表中。然後,ssis apackage可以通過執行一個exec SQL任務將該表中的信息變爲可變信息。你可以做到這一點沒有嘗試抓住,但如果事情不能正常工作,並且它插入或更新,那麼你有數據完整性問題,所以我強烈建議你修復過程。 – HLGEM

1

當您通過使用F5運行包並且SQL語句失敗時,您可以檢查執行結果選項卡,但不幸的是,這隻顯示您的SQL語句的第一行或第二行。

不使用F5運行包,而是使用Crtl + F5運行它。這將打開一個終端窗口並像運行命令行一樣運行程序包。當每個任務運行時,它將輸出日誌信息,如果任務使用SQL語句並且失敗,它將輸出完整的SQL語句。

Ctrl + F5被稱爲'開始無調試',但我總是認爲這是一個更好的調試包。

相關問題