2017-04-14 73 views
0

我在一個非常奇怪的行爲SQL Server數據庫觸發器,這些都是陌生的說明:Stringe超時觸發錯誤

... 
EXEC [ope].[spMissionDepartment] @AircraftId = @vnAircraftId 

RAISERROR('test error', 16, 1) 

END TRY 
BEGIN CATCH 
    SELECT @ErrorMessage = ERROR_MESSAGE() 

    ROLLBACK TRANSACTION 

    RAISERROR(@ErrorMessage, 16, 1) -- strange line 

END CATCH 

奇怪的行爲是這樣的:
如果我刪除怪行比我在網頁中收到的錯誤

TIMEOUT EXPIRED。在完成操作或服務器之前所提供的超時期限不予迴應。

否則,如果我刪除行奇怪,我收到錯誤

測試誤差

有沒有其他觸發器,所以EXEC應該是最後執行的語句,我怎麼可能只收到超時而沒有Raiserror

+0

嘗試在奇怪的行'RAISERROR(@ErrorMessage,9,1)' –

+0

但是,如果我使用9作爲嚴重性它將繼續,所以就像沒有_Raiserror_,奇怪的行爲是, _Raiserror_應該是最後執行的語句,爲什麼在它之後有一個超時? – davidinho

+0

也許這可以幫助你http://sqlhints.com/2013/06/30/differences-between-raiserror-and-throw-in-sql-server/ – GuidoG

回答

0

錯誤由TRY ... CATCH不受影響構建 TRY ... CATCH構建體不陷阱以下條件:

  1. 警告或信息性消息具有10或更低的嚴重程度。
  2. 嚴重性爲20或更高的錯誤會停止會話的SQL Server數據庫引擎任務處理。如果發生嚴重性爲20或更高且數據庫連接未中斷的錯誤,則TRY ... CATCH將處理該錯誤。
  3. 注意,例如客戶端中斷請求或客戶端連接斷開。
  4. 當會話由系統管理員通過使用KILL語句結束時。

    1. 編譯錯誤,如語法錯誤,即防止:

    以下類型的錯誤,當他們出現在相同的水平執行的作爲TRY ... CATCH構造不是由CATCH塊處理一批正在運行。

  5. 語句級重新編譯期間發生的錯誤,例如由於延遲名稱解析而在編譯後發生的對象名稱解析錯誤。
+0

這有什麼用?你是否建議他得到一個不會導致CATCH塊被執行的錯誤?如果是這種情況,那麼爲什麼刪除CATCH塊中的一行會改變行爲? –

+0

再做一件事就是手動執行sql studio中的proc並在每一步中放置print語句。然後找出哪些聲明需要時間... –