不能将函数调用用作RAISERROR()的参数

时间:2011-12-16 00:41:14

标签: tsql error-handling

我在T-SQL中使用try-catch块,我想只捕获一个特定的错误号。在其他情况下,我使用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
    )

这里发生了什么?为什么在将变量的结果用作RAISERROR()的参数之前,我必须将ERROR_MESSAGE()的结果存储在变量中,而不是直接调用函数?

2 个答案:

答案 0 :(得分:1)

以下帖子回答您的问题:https://stackoverflow.com/a/3415125/639960

简而言之(引自上文):

  

RAISERROR遵循与任何其他存储过程调用相同的规则。   传入的参数必须是常量或变量。你无法通过   一个函数直接作为参数。

有关此问题的文档,请参阅Executing Stored Procedures

答案 1 :(得分:0)

尝试通过取消注释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