sql - 在存储过程中使用聚合函数一次而不是多次

标签 sql tsql

我有一个存储过程,它在其中使用一个函数,并且该函数需要两个参数。
我的问题与性能问题有关,见下文

 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'

现在我要做的是创建一个临时表,这样我就可以使用它来调用函数,而不是每次到达那些需要通过数十万条记录的行时调用函数的方式。
任何帮助表示赞赏。

最佳答案

您可以像这样在查询中重用表达式:

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);

关于sql - 在存储过程中使用聚合函数一次而不是多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376027/

相关文章:

mysql - 如何从一个表中选择 CSV 行并根据键插入到另一个表中?

sql声明字符串并在where子句中使用

sql-server - 是否必须在每个 session 中指定 tabblockx?

sql-server - T-SQL 列出所有用户映射与登录的数据库角色/权限

sql-server - OUTER 应用不带子查询

sql - T-SQL [UNION ALL] 从查询结果中删除记录

sql - Microsoft Access 查询返回序号

sql - 为什么 PostgreSQL 查询在第一个新连接后的第一个请求中比在后续请求中慢?

php - 简单查询错误

显示工资变化的 SQL 触发器