通用SQL Server计数语法

时间:2010-12-13 16:54:55

标签: c# sql-server sql-server-2008

在SQL Server 2008中,我有一个用户可以对数据库运行查询的应用程序。我想阻止他们运行将返回数百万结果和税收系统资源的查询。当前的解决方案是在count(*)函数中输入任何查询,如下所示:

Select count(*) as COUNT 
from (SELECT SOMETHING FROM SOMETABLE) as TMPCOUNT0;

在用户尝试自行运行COUNT(*)之前正常工作。

Select count(*) as COUNT 
from (SELECT COUNT(*) FROM SOMETABLE) as TMPCOUNT0;  

--(should return 1)

但是,SQL Server不喜欢我的内部COUNT(*)列在我的派生表中没有名称,并且出错:

  

没有为“TMPCOUNT0”的第1列指定列名。

我知道如果我通过指定内部计数的名称来运行查询,我可以解决这个问题,但由于最终用户没有意识到这一点,我希望找到更优雅的解决方案。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

Stack Exchange Data Explorer存在之前,我在一个小网站上玩,让人们对公共Stack Overflow数据集运行查询。我最初的产品是由Atom 330提供支持,我的家里只有2GB的RAM,因此我非常担心有限的查询,以防止他们完全接管我的服务器并充斥我的家庭宽带连接。

我最终得到的是@Philip Fourie's answerSET QUERY_GOVERNOR_COST_LIMIT中提到的SET ROWCOUNT选项的组合。后者需要进行大量的调整,如果用户知道或想要尝试它们,它们都可以被覆盖,所以我也记录了每个查询,以便发现滥用。

这种组合有它的弱点,但效果很好。

答案 1 :(得分:3)

不确定如何解决COUNT(*)问题但是如何通过指定

来限制结果

SELECT TOP(1000) ...

或者

SET ROWCOUNT 1000

返回前千行。

答案 2 :(得分:0)

错误

  

没有为“TMPCOUNT0”的第1列指定列名。

发生

是因为您没有在内部查询中指定列名。

内部查询应显示为

SELECT COUNT(*) **as c** FROM SOMETABLE as TMPCOUNT0

此查询将返回1,但您必须在内部查询中指定该计数的别名。

Select count(c) as [COUNT] from (SELECT COUNT(*) as c FROM SOMETABLE) as TMPCOUNT0