Utilizzo di TRY/CATCH per gestire gli errori di SQL Server

click fraud protection

L'istruzione TRY/CATCH in Transact-SQL rileva e gestisce le condizioni di errore nelle applicazioni di database. Questa affermazione è la pietra angolare di SQL Gestione degli errori del server ed è una parte importante dello sviluppo di applicazioni di database robuste.

TRY/CATCH si applica a SQL Server a partire dal 2008, Database SQL di Azure, Azure SQL Data Warehouse e Parallel Data Warehouse.

Presentazione di PROVA/CATTURA

TRY./CATCH funziona specificando due istruzioni Transact-SQL: una che si desidera "provare" e un'altra da utilizzare per "catturare" eventuali errori che potrebbero verificarsi. Quando SQL Server rileva un'istruzione TRY/CATCH, esegue immediatamente l'istruzione inclusa nella clausola TRY. Se l'istruzione TRY viene eseguita correttamente, SQL Server va avanti. Tuttavia, se l'istruzione TRY genera un errore, SQL Server esegue l'istruzione CATCH per gestire l'errore normalmente.

La sintassi di base assume questa forma:

INIZIA A PROVARE
{ istruzione_sql | blocco di istruzioni }
instagram viewer

FINE PROVA
INIZIA LA CATTURA
[ { sql_statement | blocco_dichiarazioni } ]
FINE CATTURA
[; ]

TRY/CATCH Esempio

Considera un database delle risorse umane che contiene una tabella denominata table dipendenti, che contiene informazioni su ciascuno dei dipendenti di un'azienda. Quella tabella utilizza un numero ID dipendente intero come chiave primaria.

Potresti tentare di utilizzare la seguente dichiarazione per inserire un nuovo dipendente nel tuo database:

INSERT INTO dipendenti (id, nome, cognome, estensione)
VALORI(12497, 'Mike', 'Chapple', 4201)

In circostanze normali, questa istruzione aggiungerà una riga alla tabella Impiegati. Tuttavia, se nel database esiste già un dipendente con ID 12497, l'inserimento della riga violerebbe il vincolo della chiave primaria e comporterebbe il seguente errore:

Msg 2627, Livello 14, Stato 1, Riga 1
Violazione del vincolo PRIMARY KEY 'PK_employee_id'. Impossibile inserire la chiave duplicata nell'oggetto 'dbo.employees'.
La dichiarazione è stata chiusa.

Sebbene questo errore fornisca le informazioni necessarie per risolvere il problema, esistono due problemi. Innanzitutto, il messaggio è criptico. Include codici di errore, numeri di riga e altre informazioni incomprensibili per l'utente medio. In secondo luogo, e soprattutto, provoca l'interruzione dell'istruzione e potrebbe causare un arresto anomalo dell'applicazione.

L'alternativa è racchiudere l'istruzione in un'istruzione TRY…CATCH, come mostrato qui:

INIZIA A PROVARE
INSERT INTO dipendenti (id, nome, cognome, estensione)
VALORI(12497, 'Mike', 'Chapple', 4201)
FINE PROVA
INIZIA LA CATTURA
PRINT 'ERRORE: ' + ERROR_MESSAGE( );
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Posta dipendente',
@destinatari = '[email protected]',
@body = 'Si è verificato un errore durante la creazione di un nuovo record dipendente.',
@subject = 'Errore nel database dei dipendenti' ;
FINE CATTURA

In questo esempio, tutti gli errori che si verificano vengono segnalati sia all'utente che esegue il comando che all'indirizzo e-mail [email protected]. L'errore mostrato all'utente è:

Errore: violazione del vincolo PRIMARY KEY 'PK_employee_id'. 
Impossibile inserire la chiave duplicata nell'oggetto 'dbo.employees'.
Posta in coda.

L'esecuzione dell'applicazione continua normalmente, consentendo al programmatore di gestire l'errore. L'utilizzo dell'istruzione TRY/CATCH è un modo elegante per rilevare e gestire in modo proattivo gli errori che si verificano nelle applicazioni di database SQL Server.

Ulteriori informazioni

Per saperne di più sul linguaggio di query strutturato, dai un'occhiata al nostro articolo Fondamenti di SQL.

instagram story viewer