try transaction error_message error ejemplos catch begin sql sql-server tsql exception-handling try-catch

transaction - sql catch throw error



Levante un error manualmente en T-SQL para saltar al bloque BEGIN CATCH (5)

Here

Genera una excepción y transfiere la ejecución a un bloque CATCH de una construcción TRY… CATCH en SQL Server 2017.

Por favor, consulte el siguiente enlace

Excepción de lanzamiento de T-SQL

¿Es posible generar un error en un procedimiento almacenado manualmente para detener la ejecución y saltar al bloque BEGIN CATCH ? Algunos análogos de throw new Exception() en C# .

Aquí está el cuerpo de mi procedimiento almacenado:

BEGIN TRY BEGIN TRAN -- do something IF @foobar IS NULL -- here i want to raise an error to rollback transaction -- do something next COMMIT TRAN END TRY BEGIN CATCH IF @@trancount > 0 ROLLBACK TRAN END CATCH

Sé de una manera: SELECT 1/0 Pero es horrible !!



Puedes usar raiserror . Lea más detalles here

--de MSDN

BEGIN TRY -- RAISERROR with severity 11-19 will cause execution to -- jump to the CATCH block. RAISERROR (''Error raised in TRY block.'', -- Message text. 16, -- Severity. 1 -- State. ); END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); -- Use RAISERROR inside the CATCH block to return error -- information about the original error that caused -- execution to jump to the CATCH block. RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState -- State. ); END CATCH;

EDITAR Si está utilizando SQL Server 2012+, puede usar la cláusula throw . Here están los detalles.


SQL tiene un mecanismo de error

RAISERROR ( { msg_id | msg_str | @local_variable } { ,severity ,state } [ ,argument [ ,...n ] ] ) [ WITH option [ ,...n ] ]

Basta con mirar Raiserror en los libros en línea. Pero ... tiene que generar un error de la gravedad adecuada, un error de gravedad 0 a 10 no hace que salte al bloque catch.


Usted está buscando here .

Desde MSDN:

Genera un mensaje de error e inicia el procesamiento de errores para la sesión. RAISERROR puede hacer referencia a un mensaje definido por el usuario almacenado en la vista de catálogo sys.messages o crear un mensaje de forma dinámica. El mensaje se devuelve como un mensaje de error del servidor a la aplicación que realiza la llamada o a un bloque CATCH asociado de una construcción TRY… CATCH.

CodeProject tiene un buen artículo que también describe en profundidad los detalles de cómo funciona y cómo usarlo.