SQL Server: извлечение ошибок хранимых процедур и их использование - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь получить ошибку, полученную из другой хранимой процедуры.

Например, пользователь пытается добавить дубликат идентификатора продукта в таблицу;это потерпит неудачу и выдаст ошибку двойного ключа.Если пользователь попытается вставить NULL, он также потерпит неудачу.

Как я могу получить эти ошибки и идентифицировать их, чтобы я мог использовать ошибку для отображения другого сообщения об ошибке?Я знаю, что могу указать ошибку в выходном параметре, но не знаю, как определить, какая ошибка произошла.

Использование SQL Server 2016

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете использовать блоки TRY CATCH для обработки ошибок.Как правило, вы можете использовать следующий шаблон:

BEGIN TRY

    BEGIN TRANSACTION;
    -- CODE BLOCK GOES HERE
    COMMIT TRANSACTION;

END TRY
BEGIN CATCH; 

   IF @@TRANCOUNT > 0
   BEGIN
      ROLLBACK TRANSACTION;
   END;

   -- GET ERRORS DETAILS OR THROW ERROR

END CATCH;

Если вы не используете TRANSACTION, он будет выглядеть следующим образом:

BEGIN TRY

    -- CODE BLOCK GOES HERE

END TRY
BEGIN CATCH; 

   -- GET ERRORS DETAILS OR THROW ERROR

END CATCH;

В блоке CATCH выможно получить подробную информацию об ошибках, используя некоторые встроенные функции.Например:

BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    SELECT  
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;  
GO  

Затем, основываясь на этих деталях, вы можете что-то сделать (записать ошибку, ничего не делать, сохранить сведения об ошибке в переменной и передать их во внешнюю подпрограмму, сгенерировать ту же ошибку, используя THROW или снова с помощью THROW - создайте свой собственный THROW 51000, 'My Custom error message.', 1;.

...