2012-06-13 4 views
5

Есть ли ключевое слово или метаинформация в SQL Server, который скажет вам, если TOP вступил в силу?Sql Server TOP - б/у?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

Что является лучшим способом определить, было ли 6 или более?

I could do: 
SELECT TOP 6 count(*) FROM Stuff 

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

Спасибо!

+0

«Взять эффект», каким образом? Это означает, что он фактически ограничил ваш набор результатов? Просто пересчитайте, что вы вернули. – bluevector

+0

@jonnyGold Подсчет того, что он получил, не сказал бы ему, было ли больше доступных строк, чем он просил. – ean5533

+0

@ ean5533 Следовательно, мой запрос о разъяснении смысла «вступил в силу»? – bluevector

ответ

7

Ну, вы можете выбрать верхний N + 1 (где N в вашем примере 5, так что в вашем примере выбрать верхнюю 6) и выбросить последний в вашем клиентском коде и использовать присутствие шестого элемента для определения того, имел ли TOP эффект, если бы вы использовали N в первую очередь. Однако я не уверен, что это очень важно.

+5

+1 Это карандаш среди [космических ручек] (http://en.wikipedia.org/wiki/Space_Pen). – mafue

+0

+1 Вероятно, самый эффективный способ сделать это. –

+0

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

0

Вы можете добавить логическое значение в запрос, возвращающий значение true, когда COUNT (*) подзапроса с той же логикой возвращает значение больше 5 и false, когда оно возвращает значение 5 или меньше.

Это позволит добавить необходимую информацию к возвращаемым данным. Если вас беспокоит производительность, и запрос чрезвычайно сложный, это может не дать большого улучшения по сравнению с отдельными запросами, но в лучшем случае должно дать небольшое улучшение.

0

Там нет никакого способа сделать это без двух запросов или делать производительности убийства recacluations ...

Select TOP 5 * From Stuff 

и

Select Count(*) From Stuff 
+1

Неправда, COUNT() OVER() может сделать это –

+0

@AaronBertrand Я хотел бы видеть планы запросов, чтобы узнать, какой путь более эффективен. – bluevector

+1

Не стесняйтесь. Из всех представленных до сих пор решений, когда я выполняю все вместе, Карл и Мартин выходят на 4% от общей стоимости каждого. RedFilter's на 1% больше на 5%, HLGEM - на 42%, а ваше предложение - на 44%. Я выполнил свои тесты против sys.all_columns. –

12

Там нет ничего автоматического вы можете использовать. Вы могли бы использовать что-то вдоль этих линий

DECLARE @N INT = 5; 

WITH T 
    AS (SELECT TOP (@N + 1) * 
     FROM master..spt_values 
     ORDER BY number) 
SELECT TOP (@N) *, 
      CASE 
       WHEN Count(*) OVER() = (@N + 1) THEN 1 
       ELSE 0 
      END AS MoreRecords 
FROM T 
ORDER BY number 
+3

@AaronBertrand Нет, потому что его 'WITH' выбрал только 6 строк. – ean5533

+0

@ ean5533 Правильно, но OP 'WITH' не может. Я бы, вероятно, продемонстрировал это с помощью переменной. –

+0

@AaronBertrand - OP должен иметь «TOP 6» (или «TOP N + 1'), чтобы он мог остановить сканирование после шестой строки. –

0
SELECT TOP 5 Field1, field2, recordcount 
FROM Stuff 
CROSS JOIN (SELECT COUNT(*) as recordcount FROM Stuff) a 
ORDER BY Field1 
+0

Обратите внимание, что я удалил антипаттеры SQL с помощью SELECT * и не использовал ORDER BY при получении записей TOP N. – HLGEM

0
select top 5 *, 
    case when count(*) OVER() <= 5 then 'yes' else 'no' end as AllRecordsReturned 
from supportContacts