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.


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.


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.


8

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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.