¿Hay algún valor que pueda usar en un SELECT TOP que devolverá todas las filas?


13

Estoy permitiendo que el usuario final defina cuántas filas devuelve una consulta (SELECT TOP (@x)). ¿Hay algún valor que pueda ingresarse donde se devuelven todas las filas? ¿O tengo que crear dinámicamente la consulta sin el TOP (@x) si quieren que se devuelvan todas las filas?

Estoy usando SQL Server 2012.


Es TOP ... ORDER BYalgo? ¿ ORDER BYSigue siendo necesario algo en el caso de que seleccione todo?
Martin Smith

1
Supongo que uhhh ... ¿omitir esto TOPestá fuera de discusión? ¿Como si estuvieras lidiando con alguna consulta predefinida y tienes que pasarle algo ?
corsiKa

Respuestas:


17

Bueno, parece que TOP es un BIGINT si no estás usando un PERCENT . Eso significa que puede pasar el valor máximo de BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Dudo seriamente que alguna vez veas una mesa tan grande. Sin embargo, no estoy seguro de qué tipo de efecto tendría en el plan de consulta.


77
Suponiendo que la variable @xes un BIGINT, entonces SET @x = 0x7fffffffffffffffpuede ser más claro para algunos. Es más fácil de recordar de todos modos.
Martin Smith

@MartinSmith Seré honesto. Voy a buscarlo de cualquier manera :) Sin embargo, nunca antes había visto eso. ¿Es eso una conversión implícita?
Kenneth Fisher

77
Bueno, es más fácil de recordar si solo recuerda comenzar 7y luego el resto es Fy necesita 16 caracteres en total para los 8 bytes. Y sí, se convertirá implícitamente si se asigna a una variable de ese tipo de datos.
Martin Smith

@MartinSmith ¿Es una buena práctica confiar en la representación binaria del valor? La documentación indica que la representación binaria de un valor puede cambiar de una versión a otra de SQL Server . Además, no sé si soy la única persona, que siempre estaba confundida por la 0x7fffffffffffffffrepresentación del valor máximo de biginten SqlServer. La razón es que en la notación constante binaria SqlServer tienes 7fen el byte más bajo , mientras que en lenguajes como c ++ lo tienes en el byte más alto para obtener un máximo de tipo integral con signo.
i-one

3
@ i-one. La representación binaria de tipos enteros es extremadamente improbable que cambie. No tendría sentido que SQL Server suministre operadores bit a bit que operan en los tipos enteros si no se espera que podamos confiar en un formato específico.
Martin Smith

12

También podrías considerar

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

En lugar de

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

El valor que necesitaría para establecer @x es 0deshabilitarlo.

Esto está en desuso para las declaraciones de modificación de datos, pero no está en desuso SELECT.

En 2012 se compila un plan diferente para el caso que ROWCOUNTes 0 frente a algún valor distinto de cero.

Si ORDER BY Bazsolo está ahí para dar significado al en TOPlugar de proporcionar un orden de presentación para los resultados y no tiene un índice que lo respalde, dividirlo en dos consultas evitaría una clasificación innecesaria en el 0caso.


8

SELECT TOP 100 PERCENT se puede usar para omitir cualquier error al usar "TOP" en una consulta.


1
Para mí, eso realmente no explica la razón para usar una función que se optimiza. ¿Crystal Reports espera que aparezca un ORDER BY en la definición de vista?
Andriy M

No, Crystal Reports tiene problemas para hacerse cargo de las consultas y forzar sus propios planes de ejecución, lo que las hace muy ineficientes y, a veces, inexactas. Prefiero hacer TODA mi lógica y diseño en la consulta SQL, y simplemente hacerlo "bonito" en Crystal. Es por eso que, en su mayor parte, migré a SSIS / SSRS, pero todavía hay informes heredados.
MguerraTorres

-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable

1
La pregunta es sobre parametrizar la cláusula TOP. El OP ya tiene un parámetro ( @x) allí, y ahora están preguntando a qué valor pasar para @xque signifique "todas las filas", independientemente de cuántas filas tenga realmente la tabla. Tal vez podría descubrir cómo adaptar su solución para que coincida con los requisitos del OP.
Andriy M

1
Sin embargo, he realizado los ajustes para que se ajusten a la pregunta, ya que está escrito tiene una condición de carrera si las filas se insertan simultáneamente. Esto requeriría un bloqueo de la tabla durante la duración para resolver que bloquea las inserciones concurrentes. Esto y el gasto adicional de registrarse en primer lugar se pueden evitar simplemente usando un gran número.
Martin Smith

(SELECT COUNT(*) FROM YourTable)No es un valor.
ypercubeᵀᴹ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.