Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Retornar mensagem de erro do procedimento armazenado


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: