C# 通用SQL Server计数语法
在SQLServer2008中,我有一个应用程序,用户可以在其中对数据库运行查询。我想阻止他们运行一个将返回数百万结果和税务系统资源的查询。当前解决方案是在count(*)函数中输入任何查询,如下所示:C# 通用SQL Server计数语法,c#,sql-server,sql-server-2008,C#,Sql Server,Sql Server 2008,在SQLServer2008中,我有一个应用程序,用户可以在其中对数据库运行查询。我想阻止他们运行一个将返回数百万结果和税务系统资源的查询。当前解决方案是在count(*)函数中输入任何查询,如下所示: Select count(*) as COUNT from (SELECT SOMETHING FROM SOMETABLE) as TMPCOUNT0; 工作正常,直到用户尝试自己运行COUNT(*) Select count(*) as COUNT from (SELECT 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列指定列名
我知道如果我在运行查询时为内部计数指定一个名称,我可以解决这个问题,但是由于最终用户不知道这一点,我希望找到一个更优雅的解决方案
有什么想法吗?错误
没有为“TMPCOUNT0”的第1列指定列名
发生的原因是您尚未在内部查询中指定列名
Select count(c) as [COUNT] from (SELECT COUNT(*) as c FROM SOMETABLE) as TMPCOUNT0
内部查询应为
SELECT COUNT(*) **as c** FROM SOMETABLE as TMPCOUNT0
此查询将返回1,但必须在内部查询中指定该计数的别名
Select count(c) as [COUNT] from (SELECT COUNT(*) as c FROM SOMETABLE) as TMPCOUNT0
不确定如何解决计数(*)问题,但如何通过指定
选择顶部(1000).
或者
设置行数1000
返回前1000行。回到现有的数据集之前,我使用了一个小站点,让人们在公共堆栈溢出数据集上运行查询。我最初的产品是由Atom 330提供动力的,我家里只有2GB的RAM,因此我非常担心有限的查询,以防止它们完全接管我的服务器并淹没我的家庭宽带连接
我最终得到的是和中提到的SET ROWCOUNT
选项的组合。后者需要进行大量调整,如果用户知道或想尝试,两者都可以被覆盖,因此我还记录了每个查询,以便发现滥用
这种组合有它的缺点,但它工作得很好。我总是这样做:从SOMETABLE中选择count('x');它不必获取任何列。我也不会运行count()两次。@Eric K.Yung:count(1)比count(*)更有效是一个城市神话。-SQL Server的查询优化器足够聪明,可以理解这只是一个计数操作-它不会因为表达式中的(*)而“获取”所有数据…@Eric K.Yung,@marc_s:urban Mystion:-)你让最终用户直接查询一个大表?它应该只限于系统管理员,但即使他们有时也会从HuggeTable中选择*并融化他们的服务器。这对操作没有帮助,由于他不控制内部查询。另一种选择是在临时表中获取结果,并从中获取计数,这样他也可以控制结果。构建整个临时表仍然会带来麻烦。