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.
sql-server
Wayne E. Pfeffer
fonte
fonte
TOP ... ORDER BY
alguma coisa? É aORDER BY
coisa ainda necessária no caso que você selecionar todos?TOP
está fora de questão? Como você está lidando com alguma consulta predefinida e precisa passar alguma coisa ?Respostas:
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 ,
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.
fonte
@x
é um BIGINT,SET @x = 0x7fffffffffffffff
pode ser mais claro para alguns. É mais fácil lembrar de qualquer maneira.7
e, em seguida, o resto éF
e 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.0x7fffffffffffffff
representação do valor máximo debigint
no SqlServer. O motivo é que, na notação constante binária do SqlServer, você tem7f
o 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.Você também pode considerar
Ao invés de
O valor para o qual você precisa definir @x é
0
desativá-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 Baz
existe apenas para dar sentido àTOP
ordem 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 no0
caso.fonte
SELECT TOP 100 PERCENT pode ser usado para ignorar qualquer erro com o uso de "TOP" em uma consulta.
fonte
fonte
@x
), e agora eles estão perguntando a que valor passar para@x
que 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.(SELECT COUNT(*) FROM YourTable)
não é um valor.