Es posible que desee comenzar a usar TRY..CATCH bloquear en sus procedimientos
Entonces su procedimiento podría reescribirse como:
CREATE PROCEDURE spTest_Delete @ID INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
DELETE
FROM Test
WHERE ID = @ID;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH
END
Además, tenga en cuenta que está ejecutando una declaración de eliminación única. Significa que no necesita estar envuelto en una transacción. Esto pregunta explica por qué.
Su código se convierte en esto:
CREATE PROCEDURE spTest_Delete @ID INT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DELETE
FROM Test
WHERE ID = @ID;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH
END
Ahora, ¿por qué su @errMessage
es siempre NULL? Porque ERROR_MESSAGE()
es válido SOLO EN BLOQUE DE CAPTACIÓN. Eso está escrito en documentación
:
Uso de TRY..CATCH en Transact-SQL dice esto: