Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zwróć komunikat o błędzie z procedury składowanej

Możesz zacząć używać TRY..CATCH blokowanie w procedurach

Więc twoja procedura może zostać przepisana jako:

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

Pamiętaj też, że działasz jako pojedyncza instrukcja usuwania. Oznacza to, że nie trzeba go wiązać z transakcją. To pytanie wyjaśnia dlaczego.

Twój kod staje się taki:

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

Teraz dlaczego Twój @errMessage jest zawsze NULL? Ponieważ ERROR_MESSAGE() obowiązuje TYLKO W BLOKACH PRZEŁAPOWYCH. Jest to napisane w dokumentacji :

Korzystanie z TRY..CATCH w Transact-SQL mówi to:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak używać DOWOLNEGO / NIEKTÓREGO operatora logicznego w SQL Server — samouczek SQL Server / TSQL, część 127

  2. Jak wykonać kopię zapasową lub utworzyć nową tabelę z istniejącej tabeli SQL Server w SQL Server - SQL Server / TSQL Tutorial, część 105

  3. Pobierz strukturę tabeli UDT w VB.NET

  4. Zapytanie SQL do grupowania według dnia

  5. DATEDIFF() zwraca nieprawidłowe wyniki w programie SQL Server? Przeczytaj to.