【发布时间】:2026-01-11 00:45:01
【问题描述】:
通常,在使用 UDF 时,我坚持通过 SELECT 调用它们,但最近需要使用 EXECUTE,并且在测试时发现问题很明显。以下是目击行为的示例;
CREATE FUNCTION dbo.[fn_Example]
(
@code AS NVARCHAR(2)
)
RETURNS FLOAT
AS
BEGIN
DECLARE @result FLOAT
IF @code = 'A'
SET @result = 0
ELSE
SET @result = 0.2
RETURN @result
END
使用SELECT调用上述UDF时返回预期结果;
SELECT dbo.fn_Example('B')
输出:
0.2
但是使用EXECUTE调用时结果不正确;
DECLARE @rtn INT
EXEC @rtn = dbo.[fn_Example] @code = 'B'
SELECT @rtn
输出:
0
已经尝试过WITH RECOMPILE,但没有什么区别,就如何通过EXECUTE 调用标量 UDF 而言,我从根本上做错了什么吗?
【问题讨论】:
-
您将
@rtn声明为int。这是错误的数据类型。int永远不能存储值0.2;它不是整数。 -
@Larnu 可能就是这样,我习惯于将存储过程的返回值定义为
INT。 -
如果您在 SP 上使用
RETURN,您可能也误用了它们。您应该使用OUTPUT参数。RETURN表示用于返回 SP 的成功/错误值(0表示成功,其他任何表示不成功)。 -
@Larnu From MSDN exec docs:“当用于调用标量值用户定义函数时,@return_status 变量可以是任何标量数据类型。”所以对于标量函数
exec返回return结果。就像你说的那样,在这种情况下它不应该被声明为int -
@Andomar 我特别说明了 SP,而不是(标量)函数。函数和 SP 是完全不同的对象类型。 "如果您在 SP 上使用 RETURN..."
标签: sql-server sql-server-2014 user-defined-functions