Una guia pas a pas per utilitzar TRY ... CATCH per controlar els errors del servidor SQL

Identifica els errors sense interrompre l'execució

La instrucció TRY ... CATCH de Transact- SQL detecta i gestiona les condicions d'error en les aplicacions de la vostra base de dades. Aquesta afirmació és la pedra angular del maneig d'errors del servidor SQL i és una part important del desenvolupament d'aplicacions robustes de base de dades. TRY ... CATCH s'aplica a SQL Server a partir de 2008, Azure SQL Database, Azure SQL Data Warehouse i Parallel Data Warehouse.

Presentant TRY..CATCH

TRY ... CATCH funciona permetent especificar dues instruccions de transact-SQL: una que vulgueu "provar" i una altra que s'utilitzi per "captar" els errors que puguin sorgir. Quan SQL Server troba una instrucció TRY ... CATCH, immediatament executa la instrucció inclosa a la clàusula TRY. Si la instrucció TRY s'executa amb èxit, SQL Server només es mou. Tanmateix, si la instrucció TRY genera un error, SQL Server executa la instrucció CATCH per gestionar correctament l'error.

La sintaxi bàsica pren aquesta forma:

COMENÇA TRY {sql_statement | statement_block} END TRY BEGIN CATCH [[sql_statement | statement_block}] END CATCH [; ]

TRY ... CATCH Exemple

És més fàcil entendre l'ús d'aquesta afirmació mitjançant l'ús d'un exemple. Imagineu que sou l'administrador d'una base de dades de recursos humans que conté una taula anomenada "Empleats" que conté informació sobre cadascun dels empleats de la vostra organització. Aquesta taula utilitza un número d'identificació d'empleat sencer com a clau principal . Podeu intentar utilitzar la instrucció següent per inserir un nou empleat a la vostra base de dades:

INSERT INTO employees (id, first_name, last_name, extension) VALORS (12497, 'Mike', 'Chapple', 4201)

En circumstàncies normals, aquesta declaració afegiria una fila a la taula d'empleats. Tanmateix, si un empleat amb l'ID 12497 ja existeix a la base de dades, la inserció de la fila infringeix la restricció de la clau principal i provocarà el següent error:

Missatge 2627, Nivell 14, Estat 1, Línia 1 Violació de la restricció PRIMARY KEY 'PK_employee_id'. No es pot inserir la clau duplicada a l'objecte 'dbo.employees'. La declaració s'ha cancel·lat.

Tot i que aquest error us proporciona la informació que necessiteu per resoldre el problema, hi ha dos problemes. En primer lloc, el missatge és críptic. Inclou codis d'error, números de línia i altra informació inintel·ligible per a l'usuari mitjà. En segon lloc, i el que és més important, fa que la declaració avorti i que pugui causar un bloqueig d'aplicació.

L'alternativa és embolicar la declaració en una declaració TRY ... CATCH, tal com es mostra a continuació:

COMENÇA TRY INSERT INTO empleats (id, first_name, last_name, extension) VALORS (12497, 'Mike', 'Chapple', 4201) END TRY BEGIN IMPRIMIR IMATGE 'Error:' + ERROR_MESSAGE (); EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Correu de l'empleat', @recipients = 'hr@foo.com', @body = 'S'ha produït un error en crear un nou registre d'empleat.', @subject = 'Error de duplicació de l'ID de l'empleat'; END CATCH

En aquest exemple, es registren els errors que es produeixen tant a l'usuari que executa l'ordre com a l'adreça de correu electrònic hr@foo.com. L'error mostrat a l'usuari apareix a continuació:

Error: infracció de la restricció PRIMARY KEY 'PK_employee_id'. No es pot inserir la clau duplicada a l'objecte 'dbo.employees'. Correu en cua.

Més important encara, l'execució de l'aplicació continua amb normalitat, permetent al programador gestionar l'error amb gràcia. Ús de la instrucció TRY ... CATCH és una forma elegant de detectar i gestionar de manera proactiva els errors que es produeixen en les aplicacions de base de dades del servidor SQL.

Aprenent més

Si voleu obtenir més informació sobre l'idioma de consulta estructurada, llegiu Introducció a SQL .