2012-06-13 20 views
5

Czy istnieje słowo kluczowe lub metainformacja w programie SQL Server, które powie Ci, czy TOP przyniósł skutek?Serwer Sql TOP - używany?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

Jaki jest najlepszy sposób ustalenia, czy byłby 6 lub więcej?

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

Ale jestem zaniepokojony odrębnego zaproszenia do pobierania liczbę zapytań, ponieważ istnieje rzeczywista jest znacznie bardziej skomplikowany niż ten jeden, a na dużym stole.

Dzięki!

+0

"Jaki był efekt" w jaki sposób? Oznacza to, że faktycznie ograniczył twój zestaw wyników? Po prostu policz, co wróciłeś. – bluevector

+0

@jonnyGold Liczenie, co otrzymał, nie powie mu, czy było więcej dostępnych wierszy, niż prosił. – ean5533

+0

@ ean5533 Stąd moje pytanie o wyjaśnienie znaczenia "przyniosło skutek"? – bluevector

Odpowiedz

7

dobrze, można wybrać do góry N + 1 (gdzie N w przykładzie 5, więc w swojej przykład wybrać górną 6) i wyrzucić ostatnia w twoim kodzie klienta i użyj obecności szóstego elementu, aby określić, czy TOP miałaby efekt gdybyś użył N w pierwszej kolejności. Nie jestem jednak pewien, czy ma to jakąś wartość.

+5

+1 To ołówek wśród [kosmicznych długopisów] (http://en.wikipedia.org/wiki/Space_Pen). – mafue

+0

+1 Prawdopodobnie najbardziej skuteczny sposób robienia tego. –

+0

wow. To był długi dzień. Nie jestem pewna, jak to nie przyszło mi do głowy. – LethalFlipper

0

Do zapytania można dodać wartość boolowską, która zwraca wartość true, gdy COUNT (*) podzapytania z tą samą logiką zwraca wartość większą niż 5 i wartość false, gdy zwraca wartość 5 lub mniejszą.

To spowoduje dodanie potrzebnych informacji do zwracanych danych. Jeśli obawiasz się o wydajność, a zapytanie jest niezwykle skomplikowane, może to nie dać dużej poprawy w stosunku do oddzielnych zapytań, ale powinno dać co najwyżej niewielką poprawę.

0

Nie ma sposobu, aby to zrobić bez dwóch zapytań, czyli wydajności zabijania recacluations ...

Select TOP 5 * From Stuff 

i

Select Count(*) From Stuff 
+1

Nie prawda, COUNT() OVER() może to zrobić –

+0

@AaronBertrand Chciałbym zobaczyć plany zapytań, aby zobaczyć, która metoda jest bardziej skuteczna. – bluevector

+1

Zapraszam. Ze wszystkich rozwiązań przedstawionych do tej pory, kiedy wykonuję wszystko razem, Carl i Martin wychodzą na 4% całkowitego kosztu każdego. RedFilter's wynosi 1% więcej przy 5%, HLGEM's to 42%, a twoja sugestia w połączeniu z pozostałymi 44%. Zrobiłem moje testy przeciwko sys.all_columns. –

12

Nie ma nic automatyczny można użyć. Można użyć coś wzdłuż tych linii

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 Nie, ponieważ jego 'WITH' wybrał tylko 6 wierszy. – ean5533

+0

@ ean5533 Dobrze, ale OP 'WITH' może nie. Prawdopodobnie wykazałbym to za pomocą zmiennej. –

+0

@AaronBertrand - OP powinien mieć "TOP 6" (lub "TOP N + 1"), aby mógł zatrzymać skanowanie po szóstym rzędzie. –

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

Zauważ, że usunąłem wzorce SQL używania SELECT * i nie używając ORDER BY podczas pobierania rekordów TOP N. – HLGEM

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