Existe um valor que eu possa usar em um TOP SELECT que retornará todas as linhas?

13

Estou permitindo que o usuário final defina quantas linhas serão retornadas por uma consulta (SELECT TOP (@x)). Existe um valor que possa ser inserido onde todas as linhas são retornadas? Ou preciso criar dinamicamente a consulta sem o TOP (@x) se eles quiserem que todas as linhas sejam retornadas?

Estou usando o SQL Server 2012.

Wayne E. Pfeffer
fonte
Isso é TOP ... ORDER BYalguma coisa? É a ORDER BYcoisa ainda necessária no caso que você selecionar todos?
Martin Smith
1
Eu acho que uhhh ... apenas omitir o TOPestá fora de questão? Como você está lidando com alguma consulta predefinida e precisa passar alguma coisa ?
precisa saber é o seguinte

Respostas:

17

Bem, parece que TOP é um BIGINT se você não estiver usando um PERCENT . Isso significa que você pode transmitir o valor máximo de BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Eu duvido seriamente que você alguma vez verá uma mesa tão grande. Não tenho certeza de que tipo de efeito isso teria no plano de consulta.

Kenneth Fisher
fonte
7
Assumindo que a variável @xé um BIGINT, SET @x = 0x7fffffffffffffffpode ser mais claro para alguns. É mais fácil lembrar de qualquer maneira.
Martin Smith
@ MartinSmith Vou ser sincero, vou procurar de qualquer maneira :) Eu nunca vi isso antes. Isso é uma conversão implícita?
Kenneth Fisher
7
Bem, é mais fácil lembrar se você se lembra do começo 7e, em seguida, o resto é Fe precisa de 16 caracteres no total para os 8 bytes. E sim, será implicitamente convertido se atribuir a uma variável desse tipo de dados.
Martin Smith
@MartinSmith É uma boa prática confiar na representação binária do valor? Os estados da documentação A representação binária de um valor pode mudar de versão para versão do SQL Server . Além disso, não sei se sou a única pessoa que sempre ficou confusa com a 0x7fffffffffffffffrepresentação do valor máximo de bigintno SqlServer. O motivo é que, na notação constante binária do SqlServer, você tem 7fo byte mais baixo , enquanto que em linguagens como c ++ você o possui no byte mais alto para obter o máximo do tipo integral assinado.
i-one
3
@ i-one. A representação binária de tipos inteiros é extremamente improvável de mudar. Não haveria sentido em o SQL Server fornecer operadores bit a bit que operam nos tipos inteiros se não fosse esperado que pudéssemos confiar em um formato específico.
Martin Smith
12

Você também pode considerar

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Ao invés de

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

O valor para o qual você precisa definir @x é 0desativá-lo.

Isso foi descontinuado para instruções de modificação de dados, mas não descontinuado SELECT.

Em 2012, um plano diferente é compilado para o caso que ROWCOUNTé 0 vs algum valor diferente de zero.

Se ORDER BY Bazexiste apenas para dar sentido à TOPordem de apresentação, em vez de fornecer resultados, e você não tem um índice que suporte isso, a divisão em duas consultas evitaria uma classificação desnecessária no 0caso.

Martin Smith
fonte
8

SELECT TOP 100 PERCENT pode ser usado para ignorar qualquer erro com o uso de "TOP" em uma consulta.

MguerraTorres
fonte
1
Para mim, isso não explica realmente o motivo de usar um recurso otimizado. O Crystal Reports espera que um ORDER BY esteja presente na definição de exibição?
Andriy M
Não, o Crystal Reports tem problemas em realizar consultas e forçar seus próprios planos de execução, tornando-os muito ineficientes e, às vezes, imprecisos. Eu prefiro fazer TODA minha lógica e design na consulta SQL e simplesmente torná-la "bonita" no Crystal. É por isso que, na maioria das vezes, migrei para o SSIS / SSRS, mas ainda existem relatórios herdados por aí.
MguerraTorres
-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable
Abhilash Medi
fonte
1
A questão é sobre parametrizar a cláusula TOP. O OP já possui um parâmetro ( @x), e agora eles estão perguntando a que valor passar para @xque isso significaria "todas as linhas", independentemente de quantas linhas a tabela realmente possui. Talvez você possa descobrir como adaptar sua solução para atender aos requisitos do OP.
Andriy M
1
Fiz os ajustes para atender à pergunta, embora, como escrito, isso tenha uma condição de corrida se as linhas forem inseridas simultaneamente. Isso exigiria um bloqueio de tabela durante a duração para resolver que bloqueia inserções simultâneas. Isso e as despesas extras do check-in podem ser evitados usando apenas um número grande.
Martin Smith
(SELECT COUNT(*) FROM YourTable)não é um valor.
precisa saber é o seguinte