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
¿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 THROW
(disponible en SQL Server 2012+):
THROW 50000, ''Your custom error message'', 1
THROW <error_number>, <message>, <state>
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.