我有一个使用其中的函数的存储过程,该函数需要两个参数。 我的问题与性能问题有关,见下文
CASE
WHEN (DATEDIFF(MINUTE,dbo.FunctionName(DatetimeField, DatetimeID), dbo.FunctionName(DatetimeField, DatetimeID))/60.0) > 8 THEN
(DATEDIFF(MINUTE,dbo.FunctionName(DatetimeField, DatetimeID), dbo.FunctionName(DatetimeField, DatetimeID))/60.0)
Else 0
END
Else
0
END)
Else
(DATEDIFF(MINUTE,dbo.FunctionName(DatetimeField, DatetimeID), dbo.FunctionName(DatetimeField, DatetimeID))/60.0)-T.lunch
END
as 'Total'
现在我要做的是创建一个临时表,这样我就可以用它来调用函数,而不是每次调用函数时调用函数的方式,这些函数需要经过数十万条记录。 任何帮助表示赞赏。
答案 0 :(得分:1)
您可以在查询中重用表达式,如下所示:
select (case when NewValue > 8 then NewValue else 0 end) xyz
from T
cross apply (
select NewValue = dbo.FunctionName(DatetimeField, DatetimeID)
) x
以这种特定方式使用的交叉应用可用于引入新列并重用其值。此技术适用于在同一查询中重用常用表达式。
正常的批处理级变量可以这样声明:
DECLARE @NewValue int = dbo.FunctionName(DatetimeField, DatetimeID);
答案 1 :(得分:0)
假设您的函数是确定性的(或者至少返回相同的值而不考虑时钟时间),您可以设置一个临时表,如:
select DatetimeField, DatetimeID, FunctionName(DatetimeField, DatetimeID) as val
into #tmp
from (select distinct DatetimeField, DatetimeID
from table
) t
然后,您可以重写存储过程以使用它。
但是,在编写查询时,确定性函数只会为datediff返回0,因为这两个参数是相同的。
最后,您的性能问题似乎与被调用的函数有关。您发布代码的建议很好。