Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用SQL Server计数语法_C#_Sql Server_Sql Server 2008 - Fatal编程技术网

C# 通用SQL Server计数语法

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

在SQLServer2008中,我有一个应用程序,用户可以在其中对数据库运行查询。我想阻止他们运行一个将返回数百万结果和税务系统资源的查询。当前解决方案是在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中选择*并融化他们的服务器。这对操作没有帮助,由于他不控制内部查询。另一种选择是在临时表中获取结果,并从中获取计数,这样他也可以控制结果。构建整个临时表仍然会带来麻烦。