如何在需要组合结果时避免多次调用T-SQL函数?

Tre*_*rex 1 t-sql

我有两个T-SQL标量函数,这两个执行计算对数据的大量资金(以时间"很多"),并返回一个值,例如CalculateAllIncomes(雇员)和CalculateAllExpenditures(雇员).

我运行一个select语句来调用这些并返回每个Employee的结果.我还需要为AllIncomes-AllExpenditures计算每个员工的平衡.

我有一个函数为getBalance(雇员)调用所述两个上述功能并返回结果{CalculateAllIncomes(EmployeeID) - CalculateAllExpenditures(EmployeeID)}.但如果我这样做:

Select CalculateAllIncomes(EmployeeID), CalculateAllExpenditures(EmployeeID), GetBalance(EmployeeID) .... 功能CalcualteAllIncomes()和CalculateAllExpenditures被调用两次(一次明确而一旦为getBalance funcion内),并因此产生的查询时间,只要它应该的两倍.

我想找一些更好的解决方案.我试过了:

select alculateAllIncomes(EmployeeID), AS Incomes, CalculateAllExpenditures
(EmployeeID) AS Expenditures, (Incomes - Expenditures) AS Balance....
Run Code Online (Sandbox Code Playgroud)

但它会引发错误:

无效的列名称收入和

列名支出无效.

我确信必须有一个简单的解决方案,但我无法弄明白.出于某种原因,似乎我不能在SELECT子句中使用列别名.是这样吗?如果是这样,在这种情况下可能有什么解决方法?谢谢你的任何建议.

gbn*_*gbn 5

忘记函数调用:您可以在一个普通查询中完成所有操作.

函数调用误用(尝试OO封装)会迫使您进入这种情况.此外,如果您在Employee表中每行都有GetBalance(EmployeeID),那么您正在对表进行CURSOR.而你现在也通过多次通话复合了这一点.

你需要的是这样的:

;WITH cSUMs AS
(
SELECT
    SUM(CASE WHEN type = 'Incomes' THEN SomeValue ELSE 0 END) AS Income),
    SUM(CASE WHEN type = 'Expenditures' THEN SomeValue ELSE 0 END) AS Expenditure)
FROM
    MyTable
WHERE
    EmployeeID = @empID --optional for all employees
GROUP BY
    EmployeeID 
)
SELECT
    Income, Expenditure, Income - Expenditure
FROM
    cSUMs 
Run Code Online (Sandbox Code Playgroud)

通过从基于bog标准集的聚合查询中消除这种OO思想,我曾经从一个周末到一秒钟之内得到一个查询.