2011-12-16 2 views
0

Я использую блок try-catch в T-SQL, и я хочу только уловить определенный номер ошибки. В других случаях я использую RAISERROR() как re-throw бедных, чтобы возвращать информацию об ошибке в приложение.Невозможно использовать вызовы функций в качестве параметров для 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(), вместо прямого вызова функции?

+1

ли это просто вопрос синтаксического анализа. Если вы ожидаете, что SQL будет «реальным» языком программирования, вы обретете мир скорби. – Stu

+0

Я второй, что говорит Стю. Более прямым ответом может быть «SQL - очень очень старый язык и, следовательно, это, в основном, мусор». Я попросил изменить это поведение: https://connect.microsoft.com/SQLServer/feedback/details/352110/t-sql-use-scalar-functions-as-stored-procedure-parameters#details, но рядом с ним нет надеюсь, что это действительно произойдет. – jamiet

ответ

1

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

В двух словах (цитата из поста выше):

RAISERROR follows the same rules as any other stored procedure call. Parameters passed in must be a constant or a variable. You cannot pass a function directly as a parameter.

См Executing Stored Procedures для документации по этому вопросу.

+0

Или пойдите справа от документа RAISERROR http://msdn.microsoft.com/en-us/library/ms178592.aspx, в котором указывается, что он должен быть типом числа, строки или строкового типа (а не выражением или выражением). – Glenn

+0

error_message() возвращает строку; Я не понимаю, почему он не может быть оценен и передан в – philipd

+1

И я не понимаю, почему Microsoft не может купить гласную, но они настаивают на RaIsError, пытаясь обвинить египетского бога солнца во всех наших проблемах. Я рекомендую вам посетить https://connect.microsoft.com/, чтобы предложить усовершенствование, но не надейтесь на него. – HABO

0

Try переключение типа ошибки раскомментировав установлено @ Сбой = 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 
Смежные вопросы