2012-05-20 19 views
6

Realizo una declaración de selección. Si el número de filas en el conjunto de resultados es menor o igual que un cierto número, devuelvo las filas seleccionadas. Si el número de filas es mayor que un cierto número, no quiero devolver ninguna fila.Evite devolver el conjunto de resultados bajo ciertas condiciones

Después de ejecutar el seleccionar y hacer la comparación, si el número de filas es mayor que el número de filas permitidas, ejecuto:

SELECT TOP 0 NULL AS ID 

Lo que descubrí fue que tanto los registros que se seleccionaron inicialmente son también regresó junto con un segundo conjunto de resultados con una sola columna llamada ID y sin registros. Obviamente, la declaración de selección inicial todavía se está devolviendo y quiero evitar esto. ¿Hay alguna manera?

EDITAR: Olvidé agregar que necesito devolver un valor de estado que indique si hubo más filas de las permitidas. Esto significa que tengo que llegar al conteo y preferiría tener el conteo sin tener que ejecutar la misma consulta dos veces. Entonces, si el número máximo de filas permitido es 25 pero cero filas realmente existen, entonces devuelvo un estado de 0. Pero si el número de filas es mayor que 25, entonces no devuelvo ninguna fila pero establezco el estado en - 1.

Respuesta

5

Realice la selección en una tabla temporal, verifique el número de filas en la tabla y utilice la tabla temporal en su selección o devuelva 0 filas.

-- Your query goes here 
select ID 
into #T 
from YourTable 
--where 

-- Check the number of rows returned 
if (select count(*) from #T) <= 10 
begin 
    -- Return the data 
    select ID 
    from #T 
end 
else 
begin 
    -- Don't return anything 
    select ID 
    from #T 
    where 0 = 1 
end 

drop table #T 

También puede hacerlo en una consulta utilizando count(*) over().

select ID 
from 
    (
    select ID, count(*) over() as C 
    from YourTable 
    --where 
) T 
where C <= 10 

o con un CTE

with C as 
(
    select ID 
    from YourTable 
    --where 
) 
select ID 
from C 
where (select count(*) from C) <= 10 

elegir lo mejor se adapte a sus necesidades o preste el mejor con sus datos.

actualización
Una versión modificada tabla temporal que devuelve el número de filas.

declare @MaxRows int 
set @MaxRows = 25 

declare @ActualRowCount int 

select top(@MaxRows+1) ID 
into #T 
from YourTable 

set @ActualRowCount = @@rowcount 

if @ActualRowCount = 0 
begin 
    -- No rows returned 
    select null as ID, 0 as [RowCount] 
end 
else 
if @ActualRowCount > @MaxRows 
begin 
    -- Too many rows returned 
    select null as ID, -1 as [RowCount] 
end 
else 
begin 
    -- Return rows from temp table 
    select ID, @ActualRowCount as [RowCount] 
    from #T 
end 

drop table #T 
+0

me olvidó mencionar algo. Ver mi EDIT en la publicación original. Su solución es correcta y realmente buena, excepto que necesito devolver un estado que indique si hay demasiados registros. Parece que tendría que ejecutar una segunda consulta. ¿O sí? – AndroidDev

+0

Se agregó una versión de tabla temporal que devuelve al menos una fila con la información de recuento de filas. '-1' para demasiadas filas. –

1

supongo que está utilizando SQL Server para que pueda utilizar el @@ROWCOUNT (Devuelve el número de filas afectadas por la última declaración .)

Así que aquí un ejemplo:

SELECT ID FROM [YourTable] WHERE [Your Conditions] 

IF @@ROWCOUNT > [YourLimit] 
    SELECT ID FROM [YourTable] WHERE 0=1 // return empty records 
ELSE 
    SELECT ID FROM [YourTable] WHERE [Your Conditions] 

Eso es todo

+1

Volverá primero o ambos, por lo que siempre se devolverá primero. ¿No es así? Mientras OP pregunta cómo devolver uno u otro. – abatishchev

+0

Al igual que la solución de John, requiere ejecutar dos consultas. Uno para obtener el conteo y el otro para obtener los datos. ¿Se puede hacer con una sola consulta (una sola ejecución Select)? – AndroidDev

1

Cargue sus parámetros de conteo de filas en variables y luego SELECT:

DECLARE @rows INT; 
DECLARE @maxRows INT = 1000; --set your desired max value here 
SELECT @rows=COUNT(1) FROM [myTable]; 

SELECT ID FROM [myTable] 
WHERE @rows <= @maxRows; 

usted ya sea obtener un conjunto vacío cuando hay demasiadas filas, o el conjunto de resultados

+0

Buena solución, excepto que requiere ejecutar dos consultas. Uno para obtener el conteo y otro para obtener los datos. Parece un desperdicio. Sería bueno si solo se necesita ejecutar una sola consulta y devolver las filas o no filas si el número excede el límite. – AndroidDev

Cuestiones relacionadas