使用 EXECUTE 从 SQL 服务器调用用户定义函数时的不同标量结果
Different scalar result when calling User Defined Function from SQL Server using EXECUTE
通常,在使用 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 而言,我是否从根本上做错了什么?
完全正确。当 UDF 期望 FLOAT
.
时,我将 return 值设置为 INT
应该用过;
DECLARE @rtn FLOAT
EXEC @rtn = dbo.[fn_Example] @code = 'B'
SELECT @rtn
通常,在使用 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 而言,我是否从根本上做错了什么?
FLOAT
.
INT
应该用过;
DECLARE @rtn FLOAT
EXEC @rtn = dbo.[fn_Example] @code = 'B'
SELECT @rtn