sql >> Base de Datos >  >> RDS >> Sqlserver

Devolver mensaje de error del procedimiento almacenado

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: