gpt4 book ai didi

tsql - 为什么 UDF 中不允许使用 TRY-CATCH block ?

转载 作者:行者123 更新时间:2023-12-03 11:29:17 27 4
gpt4 key购买 nike

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

如果我们谈论的是标量 UDF,它主要用于计算和对话,那么这个块应该被大量使用,但我们没有它。

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

最佳答案

MSSQL 中的 UDF 不允许有副作用,BOL 将其定义为“更改数据库状态”。这是一个相当模糊的描述,但 MSSQL 显然认为错误会改变数据库状态——这个 UDF 不能编译:

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

错误信息是:

Msg 443, Level 16, State 14, Procedure foo, Line 5 Invalid use of a side-effecting operator 'RAISERROR' within a function.



如果认为引发错误会改变数据库状态,那么捕获和处理一个错误可能也是如此。我承认,这没什么好解释的。

但实际上,通常最好让调用者决定如何处理错误。假设你写了一个这样的函数:
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 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005453/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com