使用 EXECUTE 从 SQL Server 调用用户定义函数时的标量结果不同

Posted

技术标签:

【中文标题】使用 EXECUTE 从 SQL Server 调用用户定义函数时的标量结果不同【英文标题】:Different scalar result when calling User Defined Function from SQL Server using EXECUTE 【发布时间】:2019-08-20 10:13:09 【问题描述】:

通常,在使用 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..." 【参考方案1】:

@Larnu's comment 完全正确。当 UDF 期待 FLOAT 时,我将返回值设置为 INT

应该用过;

DECLARE @rtn FLOAT
EXEC @rtn = dbo.[fn_Example] @code = 'B'
SELECT @rtn

【讨论】:

这不是@scientist_7 的做法吗?

以上是关于使用 EXECUTE 从 SQL Server 调用用户定义函数时的标量结果不同的主要内容,如果未能解决你的问题,请参考以下文章

无法在 ETL 过程中使用 Pandas 和 SQLAlchemy 将列名从 CSV 更改为 SQL Server DB

使用 EXECUTE AS 进行安全性时 SQL Server 的加速策略

查询大型 SQL Server 表时,pymssql/pyodbc 性能(cursor.execute)非常慢

sql server execute存储过程怎么带参

sql server性能调优实战,完整版下载

sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)