Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Връща съобщение за грешка от съхранена процедура

Може да искате да започнете да използвате ОПИТАЙТЕ..ХВАНЕТЕ блокирайте във вашите процедури

Така че вашата процедура може да бъде пренаписана като:

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

Също така, моля, имайте предвид, че работите като единичен израз за изтриване. Това означава, че не е необходимо да бъде обвито в транзакция. Това въпросът обяснява защо.

Вашият код става следния:

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

Сега защо вашето @errMessage винаги е NULL? Защото ERROR_MESSAGE() важи САМО В CATCH BLOCK. Това е написано в документация :

Използване на TRY..CATCH в Transact-SQL казва това:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Шестнадесетичната стойност 0x00 е невалиден знак

  2. SQL Server Xml заявка с множество пространства от имена

  3. Структурата на обекта се зарежда много бавно за първи път след всяка компилация

  4. Как DB_NAME() работи в SQL Server

  5. „Атомарно“ ли е изпълнението на T-SQL съхранена процедура?