SQL Server中避免重复调用函数实现CASE WHEN逻辑的方法
解决SQL Server中避免重复调用标量函数的问题
要避免重复调用自定义标量函数(尤其是函数内部包含查询、重复调用会影响性能的情况),同时不用定义大量变量,你可以用CTE(公共表表达式)或者CROSS APPLY来一次性计算所有函数结果,之后在SELECT语句中直接引用这些结果即可。
方法1:使用CTE
先在CTE中一次性计算出所有需要的函数返回值,后续查询直接引用这些预计算的值:
WITH PreComputedFuncs AS ( SELECT mainCol1, maincol2, maincol3, -- 把所有需要调用的函数结果在这里一次性计算 myFunction(@param1, @param2) AS Func_Col3, myFunction(@param3, @param4) AS Func_Col4, -- ... 继续添加其他30余列对应的函数调用 myFunction(@paramX, @paramY) AS Func_ColN FROM 你的主表名 ) SELECT mainCol1, maincol2, -- 直接引用预计算的函数值,避免重复调用 CASE WHEN Func_Col3 IS NULL THEN Func_Col3 ELSE maincol3 END AS 自定义列名3, -- 其他列同理 CASE WHEN Func_Col4 IS NULL THEN Func_Col4 ELSE maincol4 END AS 自定义列名4, -- ... 其他列逻辑 FROM PreComputedFuncs
方法2:使用CROSS APPLY
如果函数的参数依赖于主表的行数据,或者更偏好这种写法,CROSS APPLY也是很好的选择:
SELECT t.mainCol1, t.maincol2, -- 直接引用APPLY中计算好的函数值 CASE WHEN f.Func_Col3 IS NULL THEN f.Func_Col3 ELSE t.maincol3 END AS 自定义列名3, CASE WHEN f.Func_Col4 IS NULL THEN f.Func_Col4 ELSE t.maincol4 END AS 自定义列名4, -- ... 其他列 FROM 你的主表名 t CROSS APPLY ( SELECT myFunction(@param1, @param2) AS Func_Col3, myFunction(@param3, @param4) AS Func_Col4, -- ... 所有需要的函数调用 myFunction(@paramX, @paramY) AS Func_ColN ) f
说明
- 这两种方法都只会对每个函数调用一次,避免了重复执行函数内部的查询,提升性能的同时也让代码更简洁。
- 你之前尝试的嵌套查询写法存在语法错误,CASE WHEN子句中不能直接嵌套赋值逻辑,预计算的方式才是正确的思路。
内容的提问来源于stack exchange,提问作者mihir
相关产品推荐
相关产品推荐

