Condividi tramite


Gestione degli errori nelle stored procedure remote tra server

Quando si eseguono stored procedure remote e batch da un'istanza locale di SQL Server a un client, è possibile che si verifichino errori di interruzione delle istruzioni e dei batch:

  • Quando si verifica un errore di interruzione di un'istruzione, l'istruzione che ha causato l'errore viene terminata ma l'esecuzione della stored procedure remota o del batch continua.

  • Quando si verifica un errore di interruzione di un batch, l'esecuzione completa della stored procedure remota o del batch viene terminata.

  • Quando si eseguono stored procedure remote e batch nell'ambito di un blocco TRY, è possibile gestire gli errori di interruzione dei batch tramite il costrutto TRY…CATCH.

Il funzionamento di stored procedure remote e batch causato dagli errori di interruzione dipende dall'impostazione SET XACT_ABORT del server locale.

SET XACT_ABORT impostata su OFF

Se SET XACT_ABORT è impostata su OFF nel server locale, gli errori di interruzione delle istruzioni nella stored procedure remota vengono propagati come errori di interruzione delle istruzioni dal server locale al client. Viene terminata solo l'istruzione che ha causato l'errore. Il client riceve i messaggi di errore corrispondenti agli errori di interruzione delle istruzioni. Se inoltre la stored procedure remota viene eseguita fino al relativo completamento, @@ERROR restituisce 0. Se l'errore si verifica nell'ambito di un blocco TRY, l'esecuzione continua e non viene richiamato il blocco CATCH.

Gli errori di interruzione dei batch nella stored procedure remota vengono propagati dal server locale al client. L'istruzione EXECUTE che ha chiamato la stored procedure remota viene terminata, ma continua l'esecuzione del batch o della stored procedure che contiene tale istruzione. Pertanto, @@ERROR restituisce il codice corrispondente all'errore che ha terminato la stored procedure remota e il valore restituito della stored procedure è NULL. Quando la stored procedure remota che genera un errore viene eseguita nell'ambito di un blocco TRY nel server locale, l'errore causa il passaggio del controllo al blocco CATCH insieme alle informazioni sull'ultimo errore nel server remoto.

Per risolvere gli errori, provare a eseguire una stored procedure remota dal blocco TRY di un costrutto TRY…CATCH. Se la stored procedure remota non viene completata correttamente, l'esecuzione passa al blocco CATCH associato nel server locale insieme alle informazioni sull'ultimo errore nel server remoto. Se la stored procedure remota viene completata correttamente, l'esecuzione continua all'interno del blocco TRY nel server locale ed è possibile utilizzare il valore restituito della stored procedure remota.

In alternativa, quando una stored procedure remota viene eseguita al di fuori dell'ambito di un blocco TRY, è possibile esaminare @@ERROR alla fine della stored procedure remota per determinare se quest'ultima è stata completata. Se @@ERROR è 0, la stored procedure remota è stata eseguita correttamente ed è possibile utilizzare il relativo valore restituito. Se @@ERROR non uguale a zero, la stored procedure remota non è stata completata correttamente e non è possibile utilizzare il relativo valore restituito.

SET XACT_ABORT impostata su ON

Se SET XACT_ABORT è impostata su ON nel server locale, l'impostazione viene propagata al server collegato. Tutti gli errori di interruzione delle istruzioni e dei batch nella stored procedure remota vengono convertiti in errori di interruzione dei batch nel server locale. Pertanto, l'esecuzione del batch o della stored procedure che ha chiamato la stored procedure remota viene terminata insieme alla stored procedure remota. Quando la stored procedure remota che genera un errore viene eseguita nell'ambito di un blocco TRY nel server locale, l'errore causa il passaggio del controllo al blocco CATCH insieme alle informazioni sull'ultimo errore nel server remoto.

Quando una stored procedure remota viene eseguita al di fuori di un blocco TRY, non è possibile esaminare il valore di @@ERROR per determinare se si è verificato un errore del batch in quanto l'istruzione successiva all'istruzione EXECUTE non viene eseguita. Pertanto, è consigliabile eseguire una stored procedure remota dal blocco TRY di un costrutto TRY…CATCH. Se la stored procedure remota non viene completata correttamente, l'esecuzione passa al blocco CATCH associato nel server locale insieme alle informazioni sull'ultimo errore nel server remoto. Se la stored procedure remota viene completata correttamente, l'esecuzione continua all'interno del blocco TRY nel server locale ed è possibile utilizzare il valore restituito della stored procedure remota.

RAISERROR e TRY…CATCH

La chiamata di RAISERROR con un livello di gravità inferiore a 20 all'interno di una stored procedure remota causa un errore di interruzione dell'istruzione nel server remoto. Un costrutto TRY…CATCH nel server locale consente di gestire solo gli errori di interruzione del batch remoto. Se una stored procedure remota chiama RAISERROR con un livello di gravità inferiore a 20 e viene eseguita nell'ambito di un blocco TRY nel server locale, RAISERROR non causa il passaggio del controllo al blocco CATCH del costrutto TRY…CATCH. Invece, la chiamata a RAISERROR con un livello di gravità uguale a 20 o superiore nel server remoto causa l'interruzione della connessione e l'esecuzione nel server locale passa al blocco CATCH.