我正在用SQL Server2008编写一个用户定义的函数。我知道函数不能以通常的方式引发错误-如果您尝试包含RAISERROR语句SQL return:
Msg 443, Level 16, State 14, Procedure ..., Line ...
Invalid use of a side-effecting operator 'RAISERROR' within a function.
但事实是,该函数接受一些输入,这可能是无效的,如果是无效的,则该函数没有可以返回的有意义的值。那我该怎么办?
当然,我可以返回NULL,但任何使用该函数的开发人员都很难解决这个问题。我还可以导致除以零或类似的东西-这将生成一个错误消息,但具有误导性。有没有办法让我自己的错误消息以某种方式被报告?
发布于 2011-01-13 23:33:28
您可以使用CAST抛出有意义的错误:
create function dbo.throwError()
returns nvarchar(max)
as
begin
return cast('Error happened here.' as int);
end
然后,Sql Server将显示一些帮助信息:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value 'Error happened here.' to data type int.
发布于 2009-09-28 06:02:29
通常的技巧是强制除以0。这将引发错误并中断正在计算函数的当前语句。如果开发人员或支持人员知道此行为,则调查和故障排除问题相当容易,因为除以0错误被理解为不同的、不相关的问题的症状。
从任何角度来看,这看起来都很糟糕,但不幸的是,目前SQL函数的设计没有更好的选择。应该绝对允许在函数中使用RAISERROR。
发布于 2012-03-06 20:16:13
根据Vladimir Korolev的回答,有条件地抛出错误的惯用法是
CREATE FUNCTION [dbo].[Throw]
(
@error NVARCHAR(MAX)
)
RETURNS BIT
AS
BEGIN
RETURN CAST(@error AS INT)
END
GO
DECLARE @error NVARCHAR(MAX)
DECLARE @bit BIT
IF `error condition` SET @error = 'My Error'
ELSE SET @error = '0'
SET @bit = [dbo].[Throw](@error)
https://stackoverflow.com/questions/1485034
复制相似问题