我在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()的结果存储在变量中,而不是直接调用函数?
答案 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