2013-03-20 70 views
6

我寫它運行在使用4點符號幾個不同的鏈接服務器SELECT查詢的存儲過程。檢查鏈接的SQL服務器正在運行

的問題是,如果鏈接的服務器的一個沒有運行,查詢失敗,錯誤121 ('The semaphore timeout period has expired')。其他SELECT查詢然後不會運行,因爲此錯誤會停止執行其餘的查詢。

我想檢查@@ERROR然後繼續運行的其他查詢。

我怎樣才能繼續運行查詢,如果該鏈接的服務器的一個連接失敗?

我使用SQL 2012

+0

歡迎鏈接的服務器,更好所知的高不可用的解決方案。嘗試設計無鏈接服務器的解決方案。 – 2013-03-20 16:13:44

+0

@Tim你嘗試使用[TRY CATCH(http://msdn.microsoft.com/en-us/library/ms175976.aspx) – 2013-03-20 16:15:34

+0

看一看:http://stackoverflow.com/questions/4442772/ sql-server-catch-exception-and-continue。那是你想要做的事情嗎? – RandomUs1r 2013-03-20 16:16:20

回答

6

您是否嘗試過你的周圍使用try-catch異常塊單呼?

 BEGIN TRY 
      --First Server Connection (Server1) 192.168.1.x 
      --If the connection isn't available it will raise an exception 
      exec sp_testlinkedserver @servername = Server1 
      --SQL statement here 
    END TRY 
    BEGIN CATCH 
      SELECT ERROR_MESSAGE() 
    END CATCH 

    BEGIN TRY 
      --Second Server Connection (Server2) 192.168.2.x 
      --If the connection isn't available it will raise an exception 
      exec sp_testlinkedserver @servername = Server2 
      --SQL statement here 
    END TRY 
    BEGIN CATCH 
      SELECT ERROR_MESSAGE() 
    END CATCH 

sp_testlinkedserver將引發一個try塊中的異常代碼的執行之前,但它不會停止存儲過程的執行。

+0

很確定這仍然會超時,並不是所有鏈接的服務器錯誤都會被捕獲。見http://dba.stackexchange.com/questions/36178/linked-server-error-not-caught-by-try-catch – 2013-03-20 16:26:06

+0

@AaronBertrand你絕對是對的,我要編輯我的代碼 – codingadventures 2013-03-20 16:35:35