SQL 函数中的两个 return 语句是啥意思?
Posted
技术标签:
【中文标题】SQL 函数中的两个 return 语句是啥意思?【英文标题】:What does two return statements inside an SQL function mean?SQL 函数中的两个 return 语句是什么意思? 【发布时间】:2016-08-29 15:12:33 【问题描述】:从这个返回小数的标量函数实际返回的代码路径:
DECLARE @SafetyStockUnitsCalcNew decimal(14,2)
RETURN( SELECT STDEV(
.
.
-- Calculating code here.
)
-- Return the result of the function
RETURN @SafetyStockUnitsCalcNew
END
那么返回什么?
是第一个 return scaler 语句还是第二个 scaler 语句?
此外,一旦声明了@SafetyStockUnitsCalcNew
,在返回之前它永远不会被使用。设置在哪里?
STDEV
中的代码根本没有引用@SafetyStockUnitsCalcNew
。
【问题讨论】:
第二个 return 永远不应该执行,因为第一个 return 总是会触发。 您确定它按原样正常工作吗? 是的,它正在工作它返回一个值。 我会说第一个 return 被执行并返回 select 产生的任何东西,而第二个 return 永远不会到达。函数应该只允许一个 return 语句。 几乎可以肯定是有人重写了proc。可能是 [DECLARE @] --> [SELECT @ = ...] --> [RETURN @]。事实上,如果你可以将它重构为一个非过程的表值函数,它的返回速度可能会快 10 倍 (***.com/questions/36576958/…)。 【参考方案1】:一个函数可以有任意多的RETURN
语句。
例如下面是三个。
当控制流遇到return
语句时,函数的执行将停止并返回值。
CREATE FUNCTION dbo.Foo(@x int)
RETURNS INT
AS
BEGIN
IF @x = 1
RETURN 10;
ELSE
RETURN 18;
RETURN 1/0;
END
SQL Server 不会执行与 C# 中相同级别的分析来检测所有代码路径是否返回值并警告您无法访问的代码。它只是坚持最后一条语句必须是return
。
在上面的例子中,第三个RETURN
语句永远无法到达,但如果没有它,您会看到错误“函数中包含的最后一个语句必须是返回语句。”。
在您的示例中,永远无法到达第二个 RETURN
语句,并且“最后一条语句”规则也不需要它,因此它是无用的。也许最初SELECT
将结果分配给变量,然后编码它的人意识到他们可以直接返回SELECT
结果。
【讨论】:
【参考方案2】:我会继续测试服务器,创建函数并注释掉第二个 RETURN,看看会发生什么。我 99% 确定它永远不会执行。
【讨论】:
我认为这应该是评论而不是答案 你是对的,它不会执行。嗯,我想知道将第二个 return 语句放在那里的目的是什么?一定是bug以上是关于SQL 函数中的两个 return 语句是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
DATEADD和DATEDIFF在SQL语句中是啥意思...?