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

Записване на стек за извикване на SQL Server при докладване на грешки

Добре, ще добавя отново нашата обработка на грешки :-)

Функциите ERROR_%() са видими в обхвата на блока CATCH. Това означава, че можете да ги използвате в съхранена процедура или извикване на функция във всеки блок CATCH

А при вложени съхранени процедури е полезно да знаете какво е причинило грешката и какво регистрира грешката

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

Така или иначе това е основната идея:всеки блок CATCH е прост, работата продължава в манипулатора на грешки. Например добавете ERROR_NUMBER() ако искате



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свързване на множество редове с данни в един ред

  2. Прилагане на клауза Where за Order by в SQL

  3. Как да изпълним съхранена процедура с входни и изходни параметри с помощта на EF?

  4. Как да внедрим прост механизъм за заключване за многопотребителско приложение?

  5. Кой е най-добрият SQL тип данни за съхраняване на JSON низ?