SQL Server - WHERE条件中的函数调用

时间:2015-02-12 16:42:43

标签: sql sql-server where

我有一个关于在我的存储过程中在SELECT语句的WHERE条件中进行函数调用的问题。这是我的模拟原始的示例查询。我在主表CDP的生产数据库中有300万条记录。我担心的是在我的WHERE子句中使用函数testFunction(@UserId)会对性能产生什么影响。

SELECT C.AwardId, C.ProgramName, Count(ClientId) as Intakes FROM CDP C 
     LEFT JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId 
     LEFT JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId
WHERE (1=1) -- here I've other filtering criteria for the results
 AND (   testFunction(@UserId) = 0
      OR (UR.ID IS NOT NULL AND UR.CDPUserId = @UserId))
GROUP BY C.AwardId, C.ProgramName

我的问题是 - 是否为结果集中的每条记录调用了该函数?由于CDP表中有300万条记录,该功能是否被称为300万次并影响性能?

我的假设是 - WHERE子句中的函数仅在最终结果集上被调用,以过滤结果。

它是ONCE还是300万次是我的问题。 BTW - 我的函数包含一个简单的select语句,内部连接到2个表,并返回一个数值。

1 个答案:

答案 0 :(得分:1)

相反,你可以做到这一点。将function结果分配给variable并在where子句

中使用它
declare @check int,
select @check = dbo.testFunction(@UserId)

SELECT C.AwardId, C.ProgramName, Count(ClientId) as Intakes FROM CDP C 
     LEFT JOIN UserRoleEntity URE ON C.AwardId = URE.EntityId 
     LEFT JOIN UserRole UR ON URE.UserRoleId = UR.Id AND UR.CDPUserId = @UserId
WHERE (1=1) -- here I've other filtering criteria for the results
 AND (   @check = 0
      OR (UR.ID IS NOT NULL AND UR.CDPUserId = @UserId))
GROUP BY C.AwardId, C.ProgramName