Você pode querer começar a usar TRY..CATCH bloquear em seus procedimentos
Portanto, seu procedimento pode ser reescrito 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
Além disso, observe que você está executando como uma instrução de exclusão única. Isso significa que não precisa ser envolvido em uma transação. Isso pergunta explica o porquê.
Seu código fica assim:
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
Agora, por que seu
@errMessage
é sempre NULL? Porque ERROR_MESSAGE()
é válido SOMENTE NO BLOCO DE CAPTURA. Isso está escrito na documentação
:Usando TRY..CATCH no Transact-SQL diz isso: