Desde SQL-Server 2008 es posible utilizar la instrucción Try…Catch. Estas instrucciones nos permiten implementar un mecanismo de control de errores: metemos un bloque de código dentro de la instrucción Try, para intentar ejecutarlo, y dentro de Catch metemos las instrucciones para controlar la respuesta en caso de error.
La sintaxis básica de un Try…Catch en SQL-Server es la siguiente:
BEGIN TRY
---Bloque de código
END TRY
BEGIN CATCH
--Código en caso de error.
END CATCH
Cuando realizamos una transacción podemos exprimir al 100% la instrucción Try…Catch. La idea es la siguiente: Comenzamos la transacción, intentamos una acción en un bloque Try. En caso de que falle mostramos el error y ejecutamos un rollback para anular la transacción. En caso de éxito confirmamos la ejecución de la transacción.
Veamos un código de ejemplo:
BEGIN TRANSACTION; --Comienza
BEGIN TRY --Aquí empieza el try
Insert into Ejemplo(Id,Nombre) values(22,'Manuel');
Delete From Espera Where Nombre = 'Manuel'
--Intentaremos esas dos acciones
END TRY
BEGIN CATCH
--El primer paso en el Catch
--Será recoger y mostrar
--Todos los errores
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
--Si hay transacción abierta
--Hacemos un rollback sobre ella
--Para anularla
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
--Fuera del bloque vamos a
--comprobar que haya transacción abierta.
--Si la hay es que no tuvo que ir por el CATCH
--Por tanto confirmamos.
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO