Поймать сбой в SQL, когда отказ вызван специально - PullRequest
1 голос
/ 26 января 2012

Сбой в хранимой процедуре при намеренном отказе.

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

Шаги для воспроизведения:

* Create Table ErrorTest 

    CREATE TABLE [dbo].[ErrorTest](

        [ErrorTest] [varchar](50) NULL

    ) ON [PRIMARY]

* Create Stored Procedure TestError

    SET NOCOUNT ON;

    DECLARE @EmailMessage AS VARCHAR(5000)

    BEGIN

        BEGIN TRY

            SELECT  ErrorTest FROM ErrorTest

        END TRY

        BEGIN CATCH             
            declare @error int, @message varchar(4000), @xstate int;
            select @error = ERROR_NUMBER()
                 , @message = ERROR_MESSAGE()
                 , @xstate = XACT_STATE();

        SET @EmailMessage = 'Failure ' + CHAR(13) + 'Error Code: '+ CAST(@error AS VARCHAR)  + CHAR(13) + @message
            EXEC    [leads].[usp_SendEmail]
                    @Mysubject = N'FAILURE!',
                    @Mybody = @EmailMessage,
                    @Myrecipients = N'me@email.com'                                     
        END CATCH
        END
  • Измените имя столбца на шаге 1 с [ErrorTest] - [ErrorTest2]

  • Это приведет к сбою хранимой процедуры с ошибкой

    Сообщение 207, уровень 16, состояние 1, ошибка процедуры Test, строка 8 Неверное имя столбца 'ErrorTest'.

  • Улов никогда не выполняется.

1 Ответ

5 голосов
/ 26 января 2012

SP никогда не выполняется - он просто не компилируется - поэтому выполнять нечего

Перепишите ваш раздел TRY таким образом и попробуйте еще раз:

BEGIN TRY

    EXEC('SELECT  ErrorTest FROM ErrorTest')

END TRY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...