Невозможно использовать вызовы функций в качестве параметров для RAISERROR () - PullRequest
0 голосов
/ 16 декабря 2011

Я использую блок try-catch в T-SQL и хочу отлавливать только определенный номер ошибки.В других случаях я использую RAISERROR () в качестве переброски бедного человека для возврата информации об ошибках в приложение.

При попытке выполнить следующее я получаю сообщение об ошибке «Неверный синтаксис рядом с error_message»:

raiserror
    (
         error_message()
        ,1
        ,1
    )

Следующее, однако, работает нормально:

declare @err varchar(100)
set @err = error_message()

raiserror
    (
         @err
        ,1
        ,1
    )

Я думал, что это может быть причудой приведения типов, поэтому я попробовал это, но это также привело к синтаксической ошибке:

raiserror
    (
         cast(error_message() as varchar(100))
        ,1
        ,1
    )

Что здесь происходит?Почему я должен сохранить результат ERROR_MESSAGE () в переменной, прежде чем использовать его в качестве параметра для RAISERROR (), вместо непосредственного вызова функции?

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Ниже сообщение отвечает на ваш вопрос: https://stackoverflow.com/a/3415125/639960

В двух словах (цитата из сообщения выше):

RAISERROR следует тем же правилам, что и любой другой вызов хранимой процедуры.Передаваемые параметры должны быть константой или переменной.Вы не можете передать функцию напрямую в качестве параметра.

См. Выполнение хранимых процедур для документации по этому вопросу.

0 голосов
/ 05 апреля 2013

Попробуйте переключить тип ошибки, раскомментировав set @ Fail = GETDATE () и увидите, что он не очень реалистичен

set nocount on
begin 

declare @ErrorMessage varchar(100)
declare @ErrorState varchar(100)
declare @ErrorSeverity varchar(100)
declare @ErrorNumber varchar(100)

declare @Fail int 

    begin try
        --set @Fail= GETDATE()
        set @Fail = 1/0
    end try

    begin catch

    print 'Why can''t it catch all type of errors like implicit conversion'
    SELECT @ErrorMessage = ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();

    RAISERROR (@ErrorMessage -- Message text.
               ,@ErrorState -- State.
               ,@ErrorSeverity -- Severity.
               );
    end catch
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...