首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从SQL Server用户定义函数报告错误

如何从SQL Server用户定义函数报告错误
EN

Stack Overflow用户
提问于 2009-09-28 01:33:39
回答 6查看 73.4K关注 0票数 160

我正在用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,但任何使用该函数的开发人员都很难解决这个问题。我还可以导致除以零或类似的东西-这将生成一个错误消息,但具有误导性。有没有办法让我自己的错误消息以某种方式被报告?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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.
票数 237
EN

Stack Overflow用户

发布于 2009-09-28 06:02:29

通常的技巧是强制除以0。这将引发错误并中断正在计算函数的当前语句。如果开发人员或支持人员知道此行为,则调查和故障排除问题相当容易,因为除以0错误被理解为不同的、不相关的问题的症状。

从任何角度来看,这看起来都很糟糕,但不幸的是,目前SQL函数的设计没有更好的选择。应该绝对允许在函数中使用RAISERROR。

票数 20
EN

Stack Overflow用户

发布于 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)    
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1485034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档