Sql server 2008 在函数上使用HAVING子句会导致select

Sql server 2008 在函数上使用HAVING子句会导致select,sql-server-2008,tsql,Sql Server 2008,Tsql,我不知道如何使用使子句避免函数调用两次 这是我的简历: select col1, col2, dbo.someFunction(param1, param2) as col3 from... where ... group ... having dbo.someFunction(param1, param2) > 0 如果我写 having col3 > 0 服务器sais:列名“col3”无效。 有没有一种方法可以在显示的情况下使用have,而不调用函数dbo.someFunc

我不知道如何使用
使
子句避免函数调用两次

这是我的简历:

select col1, col2, dbo.someFunction(param1, param2) as col3
from...
where ...
group ...
having dbo.someFunction(param1, param2) > 0
如果我写

having col3 > 0
服务器sais:
列名“col3”无效。

有没有一种方法可以在显示的情况下使用
have
,而不调用函数dbo.someFunction两次

编辑

我的执行计划包括:

并且没有(评论):

选择时不使用选择中的功能:

为了不调用函数两次,而是引用列
col3
中返回的结果,您需要在查询周围使用另一个SELECT语句,如下所示

SELECT col1,
    col2,
    col3
FROM
   (SELECT col1, 
       col2, 
       dbo.someFunction(param1, param2) AS col3 
   FROM ... 
   WHERE... ) AS Result
GROUP BY ...
HAVING col3 > 0

您不能在SELECT的同一“嵌套级别”上通过别名引用列,这就是为什么您必须在另一个SELECT语句中包围初始结果的原因,从该语句中,您可以通过别名引用列。

您确定它调用了两次吗

我从以下两个查询中得到相同的执行计划

select enumID 
from docSVenum1
group by enumID 
having COUNT(*)  > 2000  


select enumID, count(*) as ccount
from docSVenum1
group by enumID 
having COUNT(*)  > 2000

我们无法确定OP是否发布了他收到的执行计划。优化器可以根据多个因素(如联接、表中的数据量等)生成不同的执行计划。即使您的示例得到相同的执行计划,也无法保证OP得到相同的结果。@RaduGheorghiu请参见第1段您为什么要比较与否?这将改变查询-是的,您将得到不同的计划。比较select中有无函数。@是的,你说得对。已更新,选择中没有任何功能。看起来没有什么区别,这很好。我认为这将失去对分组索引的使用。