2013-03-20 7 views
6

Sto scrivendo una stored procedure che esegue query SELECT su diversi server collegati utilizzando la notazione a 4 punti.Verificare se è in esecuzione un server SQL collegato

Il problema è che se uno dei server collegati non è in esecuzione, la query non riesce con l'errore 121 ('The semaphore timeout period has expired'). Le altre query SELECT non vengono quindi eseguite poiché questo errore interrompe il resto dell'esecuzione della query.

Volevo controllare @@ERROR quindi continuare a eseguire le altre query.

Come posso continuare a eseguire la query se la connessione a uno dei server collegati non riesce?

Sto usando SQL 2012.

+0

Benvenuti in server collegati, meglio noti come The High Unavailability Solution. Prova a progettare una soluzione senza un server collegato. –

+0

@Tim hai provato a utilizzare [TRY CATCH] (http://msdn.microsoft.com/en-us/library/ms175976.aspx) –

+0

dai uno sguardo a: http://stackoverflow.com/questions/4442772/ sql-server-catch-exception-and-continue. È questo il senso di ciò che stai cercando di fare? – RandomUs1r

risposta

6

Hai provato a circondare la chiamata singola con blocchi di eccezioni 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 sarà sollevare un'eccezione all'interno di un blocco try prima dell'esecuzione del vostro codice, ma non si fermerà l'esecuzione della stored procedure.

+0

Abbastanza sicuro che questo sarà ancora timeout, e non verranno catturati tutti gli errori del server collegato. Vedi http://dba.stackexchange.com/questions/36178/linked-server-error-not-caught-by-try-catch –

+0

@AaronBertrand hai decisamente ragione, ho intenzione di modificare il mio codice – codingadventures