Ошибка перехвата SQL Server из расширенной хранимой процедуры - PullRequest
0 голосов
/ 07 января 2010

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

srv_sendmsg(pSrvProc, SRV_MSG_ERROR, errorNum, SRV_FATAL_SERVER, 1,
            NULL, 0, (DBUSMALLINT) __LINE__, 
            buff,
            SRV_NULLTERM);

Я установил уровень серьезности в SVR_FATAL_SERVER просто для проверки, могу ли я заставить сообщение выдать исключение в sql.

В моем SQL я делаю:

BEGIN TRY
    EXEC dbo.xp_somethingCool
    SET @Error = @@ERROR
END TRY
BEGIN CATCH
    PRINT 'AN Error occoured!'
    SELECT ERROR_NUMBER() AS ErrorNumber
          ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

Я бы подумал, что когда мой xp отправит сообщение об ошибке, tsql перехватит ошибку и выберет error_number и error_message. Вместо этого происходит то, что xp отправляет сообщение, а T-SQL продолжает свой путь, как будто ничего не произошло. Переменная @@ Error также не устанавливается.

Так что мне было интересно, есть ли какой-нибудь трюк, чтобы заставить SQL ловить ошибку из XP?

Спасибо, Raul

Ответы [ 3 ]

0 голосов
/ 07 января 2010

Никогда не поднимай ничего так высоко. Все, что поднято со степенью серьезности выше 16, прервет пакет, поэтому ваш блок перехвата T-SQL никогда не сможет работать. Что-то столь же высокое, как SVR_FATAL_SERVER, немедленно отключит сервер.

0 голосов
/ 04 апреля 2010

Вы можете проверить результат только из расширенного хранимого процесса и использовать его для выдачи исключения.

...
EXEC @rtn = dbo.xp_somethingCool
IF @rtn <> 0
    RAISERROR ...
...

В очень простых терминах расширенный хранимый процесс не является SQL, запускаемым ядром базы данных, поэтому вы не можете запустить RAISERROR. См. KB 190987 для получения дополнительной информации

0 голосов
/ 07 января 2010

Вы можете использовать RAISERROR , чтобы выдать исключение.

За комментарий: Вы не создаете свой собственный расширенный хранимый процесс? Если это так, вы можете использовать throw или сделать что-то вроде 1/0, чтобы вызвать исключение.

...