Sql 在select语句中多次调用标量函数是否会多次运行该函数,如果是,如何避免

Sql 在select语句中多次调用标量函数是否会多次运行该函数,如果是,如何避免,sql,sql-server,tsql,Sql,Sql Server,Tsql,如果我有一个select语句,其中包含一个用于各种计算的标量函数,那么这个标量函数会被多次调用吗?如果是这样,有没有办法优化它,使它每次选择只调用一次函数,就像在我的实际查询中,它将被调用数千次,每次选择6次 例如: SELECT [dbo].[fn_Days](@Account) + u.[DayRate], [dbo].[fn_Days](@Account) / u.[WorkDays] FROM [dbo].[tblUnit] u fn_days所做的就是返回工作天数的整数。是的,标量

如果我有一个select语句,其中包含一个用于各种计算的标量函数,那么这个标量函数会被多次调用吗?如果是这样,有没有办法优化它,使它每次选择只调用一次函数,就像在我的实际查询中,它将被调用数千次,每次选择6次

例如:

SELECT 
[dbo].[fn_Days](@Account) + u.[DayRate],
[dbo].[fn_Days](@Account) / u.[WorkDays]
FROM [dbo].[tblUnit] u

fn_days所做的就是返回工作天数的整数。

是的,标量会按编码方式多次调用。使其工作的一种方法是将其包装成如下子查询:

SELECT t.[days] + t.[DayRate],
       t.[days] / t.[WorkDays]
FROM (
     SELECT 
     [dbo].[fn_Days](@Account) as days,
     u.[DayRate],
     u.[WorkDays]
     FROM [dbo].[tblUnit] u) as t
这样,fn_Days每行只调用一次,而不是像您提到的那样调用两次或六次


希望这有帮助。

函数是确定性的,这意味着它将始终为给定参数返回相同的值。您使用的是一个变量作为参数,因此可以在执行查询之前调用函数一次,并在查询中使用结果,而不是调用函数

DECLARE @Days int
SET @Days = [dbo].[fn_Days](@Account)

SELECT 
  @Days + u.[DayRate],
  @Days / u.[WorkDays]
FROM [dbo].[tblUnit] u  

是的,我知道它在每一行都运行,但是由于它在同一行中运行了2次,我是否可以使用相同的值,这样我就不必在每一行中运行多次?请注意,就在您发布评论时。从理论上讲,它可以存储价值,但我怀疑它是否会。一种粗略的方法是,创建一个故意需要很长时间才能运行的函数,然后在查询中调用它一次,在查询中调用它两次,并比较运行时间。如果连接到一个已将函数结果作为列的集合,请查看查询计划。