2012-06-13 32 views
5

¿Hay una palabra clave o metainformación en SQL Server que le indicará si TOP entró en vigencia?Sql Server TOP - used?

EX: 
Select TOP 5 * From Stuff 

RESULT: 5 rows 

¿Cuál es la mejor manera de determinar si habría habido 6 o más?

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

pero estoy preocupado por una llamada independiente a recuperar el recuento porque hay consulta real es mucho más complicado que éste y en una mesa grande.

Gracias!

+0

"¿Ha tenido efecto" de qué manera? ¿Quiere decir que en realidad limitó su conjunto de resultados? Solo cuenta lo que recibiste. – bluevector

+0

@jonnyGold Contando lo que recibió no le diría si había más filas disponibles de las que pedía. – ean5533

+0

@ ean5533 Por lo tanto, ¿pido aclaraciones sobre el significado de "entró en vigencia"? – bluevector

Respuesta

7

Bueno, se podría seleccionar la parte superior de N + 1 (donde N en su ejemplo es 5, por lo que en su ejemplo seleccionar el 6 arriba) y deseche el último en su código de cliente, y use la presencia de un sexto elemento para determinar si TOP hubiera tenido un efecto si hubiera usado N en primer lugar. Sin embargo, no estoy seguro de que haya mucho valor para hacer esto.

+5

+1 Este es un lápiz entre [plumas espaciales] (http://en.wikipedia.org/wiki/Space_Pen). – mafue

+0

+1 Probablemente la forma más eficiente de hacerlo. –

+0

wow. Ha sido un largo día. No estoy seguro de cómo eso no pasó por mi mente. – LethalFlipper

0

Puede agregar un valor booleano en la consulta que devuelve verdadero cuando COUNT (*) de una subconsulta con la misma lógica devuelve un valor mayor que 5 y falso cuando devuelve un valor de 5 o menos.

Esto agregaría la información que necesita a los datos que se devuelven. Si le preocupa el rendimiento, y la consulta es extremadamente complicada, puede que esto no proporcione una gran mejora con respecto a las consultas por separado, pero debería proporcionar, en el mejor de los casos, una mejora menor.

0

No hay manera de hacerlo sin dos consultas o hacer matar rendimiento recacluations ...

Select TOP 5 * From Stuff 

y

Select Count(*) From Stuff 
+1

No es cierto, COUNT() OVER() puede hacer esto –

+0

@ AaronBertrand Me gustaría ver la consulta para ver qué camino es más eficiente. – bluevector

+1

Siéntase libre. De todas las soluciones presentadas hasta ahora, cuando ejecuto todas juntas, las de Carl y Martin representan el 4% del costo total de cada una. RedFilter's es 1% más al 5%, HLGEM's es 42% y su sugerencia combinada para el otro 44%. Hice mis pruebas contra sys.all_columns. –

12

hay nada automático que puede utilizar. Usted podría utilizar algo en este sentido

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 No, porque su 'CON 'solo seleccionó 6 filas. – ean5533

+0

@ ean5533 Correcto, pero el 'OF' de OP podría no. Probablemente demostraría esto usando una variable. –

+0

@ Aaronofertrand - El OP debe tener un 'TOP 6' (o' TOP N + 1') para que pueda detener el escaneo después de la 6ª fila. –

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

Tenga en cuenta que eliminé los antipatrones SQL de usar SELECT * y no usar un ORDER BY al obtener los registros TOP N. – HLGEM

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