sql-server - todas - seleccionar todo excepto sql server
seleccione TOP(todo) (8)
El mayor valor posible que se puede pasar a TOP
es 9223372036854775807
por lo que podría pasar eso.
A continuación, uso el formulario binario para bigint con signo máximo, ya que es más fácil de recordar siempre y cuando se conozca el patrón básico y ese bigint sea de 8 bytes.
declare @t bigint = case when some_condition then 10 else 0x7fffffffffffffff end;
select top(@t) *
From table
Si no tiene una cláusula orden por orden, los 10 principales serán solo 10 y dependerán de la optimización.
Si tiene una cláusula orden por para definir el top 10 y un índice para admitirlo, entonces el plan para la consulta anterior debería estar bien para cualquier valor posible.
Si no tiene un índice de apoyo y el plan muestra una clasificación, debe considerar dividir en dos consultas.
declare @t int
set @t = 10
if (o = ''mmm'') set @t = -1
select top(@t) * from table
¿Qué pasa si quiero, en general, resultó con 10 filas, pero rara vez todos ellos.
Sé que puedo hacer esto a través de "SET ROWCOUNT". Pero, ¿hay algún número variable, como -1, que haga que TOP dé como resultado todos los elementos?
La mejor solución que he encontrado es seleccionar las columnas necesarias con todas sus condiciones en una tabla temporal, luego hacer su parte superior condicional:
DECLARE @TempTable TABLE(cols...)
INSERT INTO @TempTable
SELECT blah FROM ...
if (condition)
SELECT TOP 10 * FROM @tempTable
else
SELECT * FROM @tempTable
De esta manera, sigue DRY, obtiene su TOP condicional y es tan fácil de leer.
Aclamaciones.
No estoy seguro de entender tu pregunta.
Pero si a veces quieres TOP y otras veces no solo usas si / else construye:
if (condition)
''send TOP
SELECT TOP 10 Blah FROM...
else
SELECT blah1, blah2 FROM...
Puede usar SQL dinámico (pero yo, personalmente, intento evitar el SQL dinámico), donde crea una cadena de la declaración que desea ejecutar a partir de condiciones o parámetros. También hay buena información aquí sobre cómo hacerlo sin SQL dinámico:
También es posible con un UNION y un parámetro.
SELECT DISTINCT TOP 10
Column1, Column2
FROM Table
WHERE @ShowAllResults = 0
UNION
SELECT DISTINCT
Column1, Column2
FROM Table
WHERE @ShowAllResults = 1
Use la declaración "SET ROWCOUNT @recordCount" al comienzo de la consulta de resultados. La variable "@recordCount" puede ser cualquier entero positivo. Debe ser 0 para devolver todos los registros.
eso significa que "SET ROWCOUNT 0" devolverá todos los registros y "SET ROWCOUNT 15" devolverá solo las 15 filas TOP del conjunto de resultados.
El inconveniente puede ser el impacto de rendimiento cuando se trata de una gran cantidad de registros. Además, el SET ROWCOUNT será efectivo en todo el ámbito de ejecución de toda la consulta.
una versión dinámica de SQL no es eso difícil de hacer.
CREATE PROCEDURE [dbo].[VariableTopSelect]
-- Add the parameters for the stored procedure here
@t int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
declare @sql nvarchar(max)
if (@t=10)
begin
set @sql=''select top (10) * from table''
end
else
begin
set @sql=''select * from table''
end
exec sp_executesql @sql
END
con este sp, si envían 10 al sp, seleccionará los 10 primeros, de lo contrario seleccionará todos.
declare @top bigint = NULL
declare @top_max_value bigint = 9223372036854775807
if (@top IS NULL)
begin
set @top = @top_max_value
end
select top(@top) *
from [YourTableName]