Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Enregistrement de la pile d'appels SQL Server lors du signalement d'erreurs

Ok, je vais rajouter notre gestion des erreurs dans :-)

Les fonctions ERROR_%() sont visibles dans la portée du bloc CATCH. Cela signifie que vous pouvez les utiliser dans une procédure stockée ou un appel de fonction dans chaque bloc CATCH

Et avec les procs stockés imbriqués, il est utile de savoir ce qui a causé l'erreur et ce qui enregistre l'erreur

...
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

C'est de toute façon l'idée de base :chaque bloc CATCH est simple, le travail se poursuit dans le gestionnaire d'erreurs. Par exemple, ajoutez ERROR_NUMBER() si tu veux