为什么SQL Server不支持UDF中的TRY-CATCH块?

如果我们谈论的是标量UDF,这些标量UDF主要用于计算和对话,则应该大量使用此块,但是我们没有。

另外,您为此使用什么解决方法?

最佳答案

MSSQL中的UDF不允许有副作用,BOL定义为“更改数据库状态”。这是一个模糊的描述,但是MSSQL显然考虑了更改数据库状态的错误-此UDF无法编译:

create function dbo.foo()
returns int
as
begin
    raiserror('Foo', 16, 1)
    return 1
end
go

错误消息是:



如果考虑引发错误以更改数据库状态,那么大概也应该捕获并处理一个数据库。我承认,这并不是什么解释。

但是,实际上,通常最好还是让调用者决定如何处理错误。假设您编写了这样的函数:
create function dbo.divide (@x int, @y int)
returns float
as
begin
return @x / cast(@y as float)
end

您将如何处理应用程序对@y传递零的情况?如果您发现除以零的异常,下一步该怎么做?考虑到您可能根本不知道哪个应用程序正在调用您的函数,您可以从对调用者有意义的函数中返回什么值?

您可能会考虑返回NULL,但是使用您的函数的应用程序开发人员会同意吗?他们所有的应用程序是否都认为零除误差具有相同的影响或重要性?更不用说某些地方的NULL可能会完全改变查询结果,也许是应用程序开发人员根本不想要的方式。

如果您是唯一的开发人员,那么也许这不是问题,但是随着更多的人,它很快就会成为一个问题。

关于tsql - 为什么UDF内不允许TRY-CATCH块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2005453/

10-16 03:41