una todas seleccionar repetir menos las excluir excepto ejemplos distinctrow datos dato columnas algo sql-server

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...



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]