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

Rejestrowanie stosu wywołań SQL Server podczas zgłaszania błędów

Ok, dodam naszą obsługę błędów z powrotem :-)

Funkcje ERROR_%() są widoczne w zakresie bloku CATCH. Oznacza to, że możesz ich używać w przechowywanej procedurze lub wywołaniu funkcji w każdym bloku CATCH

A dzięki zagnieżdżonym przechowywanym procesom warto wiedzieć, co spowodowało błąd i co go rejestruje

...
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 AND @starttrancount = 0 
        ROLLBACK TRANSACTION
    EXEC dbo.MyExceptionHandler @@PROCID, @errmsg OUTPUT;
    RAISERROR (@errmsg, 16, 1);
END CATCH

---with this handler (cut down version of ours)
CREATE PROCEDURE dbo.MyExceptionHandler
    @CallerProcID int,
    @ErrorMessage varchar(2000) OUTPUT
WITH EXECUTE AS OWNER --may be needed to get around metadata visibility issues of OBJECT_NAME
AS
SET NOCOUNT, XACT_ABORT ON;

BEGIN TRY
    SET @ErrorMessage = --cutdown
            CASE
                WHEN @errproc = @callerproc THEN        --Caller = error generator
                        --build up stuff

                ELSE    --Just append stuff             --Nested error stack
            END;

    IF @@TRANCOUNT = 0
        INSERT dbo.Exception (Who, TheError, WhatBy, LoggedBy)
        VALUES (ORIGINAL_LOGIN()), RTRIM(ERROR_MESSAGE()), ERROR_PROCEDURE(), OBJECT_NAME(@CallerProcID));
END TRY
BEGIN CATCH
   --and do what exactly?
END CATCH
GO

W każdym razie jest to podstawowa idea:każdy blok CATCH jest prosty, praca trwa w obsłudze błędów. Np. dołącz ERROR_NUMBER() jeśli chcesz



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Serwer sql używa kolumny obliczeniowej

  2. java.sql.SQLException:nie znaleziono odpowiedniego sterownika dla jdbc:microsoft:sqlserver

  3. SQL Server 2008 R2 Użytkownik nie może korzystać z procedury systemowej

  4. Miesiące między dwiema datami

  5. varbinary do ciągu w SQL Server