Каков уровень серьезности ошибки при отсутствии таблицы на сервере SQL?Как я могу зафиксировать ошибку в блоке перехвата и вернуть серьезность? - PullRequest
0 голосов
/ 22 марта 2019

Вот мой фрагмент кода:

CREATE OR ALTER PROC abc 
AS
BEGIN
BEGIN TRY
/* write an insert to a table that does not exist*/ 
insert into xyz select 1
END TRY
BEGIN CATCH
RAISE ERROR( 'dsd',16,1)
END CATCH
END

Теперь отсутствующий объект БД имеет серьезность 11 в соответствии с этой статьей: Ссылка MSDN серьезность ошибки SQL

Так почему же его не поймали? Если я заменю вставку сценарием деления на 0, у меня сработает ошибка повышения. Кроме того, как я могу вернуть ERROR_SEVERITY () в качестве выходного параметра?

1 Ответ

1 голос
/ 22 марта 2019

Это поведение задокументировано

Следующие типы ошибок не обрабатываются блоком CATCH, когда они происходят на том же уровне исполнения, что и TRY ... CATCH построить:

  • Ошибки компиляции, такие как синтаксические ошибки, которые мешают пакету работает.

  • Ошибки, возникающие при перекомпиляции на уровне операторов, например, объект разрешение имен ошибки, возникающие после компиляции из-за отложенное разрешение имен.

  • Ошибки разрешения имен объектов

Эти ошибки возвращаются на уровень, на котором запущен пакет, сохраняются процедура или триггер.

Вы не можете поймать несуществование объекта с TRY...CATCH в хранимой процедуре.

Например:

CREATE PROC TestProc AS
BEGIN

    BEGIN TRY

        SELECT *
        FROM dbo.doesnoexists;
    END TRY
    BEGIN CATCH
        PRINT ('An error occured!')
    END CATCH
END
GO

EXEC TestProc;

Возвращает ошибку:

Сообщение 208, Уровень 16, Состояние 1, Процедура TestProc, Строка 6 [Стартовая Строка 15] Неверное имя объекта 'dbo.doesnoexists'.

Вам нужно сделать TRY...CATCH вне процедуры.

ALTER PROC TestProc AS
BEGIN


    SELECT *
    FROM dbo.doesnoexists;

END
GO
BEGIN TRY
    EXEC TestProc;
END TRY
BEGIN CATCH
    PRINT 'An error occured!';
END CATCH

Затем будет напечатано 'An error occured!'. Конечно, вместо этого используйте ERROR_NUMBER(), ERROR_MESSAGE() и т. Д., Чтобы получить более подробную информацию о произошедшей ошибке и зарегистрировать их по мере необходимости.

...