Общий синтаксис подсчета SQL Server - PullRequest
0 голосов
/ 13 декабря 2010

В 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(*) не имеет имени в моей производной таблице и выдает следующие ошибки:

Не указано имя столбца для столбца 1 в TMPCOUNT0'.

Я знаю, что мог бы исправить это, если бы выполнял запрос, указав имя для внутреннего счета, но, поскольку конечные пользователи не знают об этом, я надеюсь найтиболее элегантное решение.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 13 декабря 2010

Еще до появления Stack Exchange Data Explorer Я поиграл с небольшим сайтом, чтобы люди могли выполнять запросы к общедоступному набору данных Stack Overflow.Мое первоначальное предложение было основано на Atom 330 с только 2 ГБ оперативной памяти, размещенной у меня дома, и поэтому я был очень обеспокоен ограниченными запросами, чтобы они не могли полностью захватить мой сервер и затопить мое домашнее широкополосное соединение.

* 1004В итоге я получил комбинацию SET ROWCOUNT, упомянутую в @ ответ Филиппа Фурье и SET QUERY_GOVERNOR_COST_LIMIT .Последнее требует большой настройки, и оба могут быть переопределены, если пользователь знает или думает попробовать его, поэтому я также регистрировал каждый запрос, чтобы определить злоупотребление.

У этой комбинации есть свои недостатки, но она работаеточень хорошо.

3 голосов
/ 13 декабря 2010

Не уверен, как решить вашу проблему COUNT (*), но как насчет ограничения результата, указав

SELECT TOP(1000) ...

или альтернативно

SET ROWCOUNT 1000

чтобы вернуть первую тысячу строк.

0 голосов
/ 13 декабря 2010

Ошибка

Не указано имя столбца для столбца 1 TMPCOUNT0.

произошло из-за того, что у вас нетНе указано имя столбца во внутреннем запросе.

Внутренний запрос должен читаться как

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

Этот запрос вернет 1, но вы должны указать псевдоним для этого числаво внутреннем запросе.

Select count(c) as [COUNT] from (SELECT COUNT(*) as c FROM SOMETABLE) as TMPCOUNT0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...