Eu tenho essa consulta com o MySQL:
select * from table1 LIMIT 10,20
Como posso fazer isso com o SQL Server?
sql
sql-server
migration
Grandes bolas
fonte
fonte
Respostas:
Iniciando o SQL SERVER 2005, você pode fazer isso ...
ou algo assim para as versões 2000 e inferiores ...
fonte
Desajeitado, mas vai funcionar.
A omissão do MSSQL de uma cláusula LIMIT é criminal, IMO. Você não deveria ter que fazer esse tipo de solução alternativa.
fonte
A partir do SQL SERVER 2012, você pode usar a cláusula OFFSET FETCH:
http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx
Isso pode não funcionar corretamente quando a ordem de não é exclusiva.
Se a consulta for modificada para ORDER BY OrderDate, o conjunto de resultados retornado não será o esperado.
fonte
Isso é quase uma duplicata de uma pergunta que fiz em outubro: Emular a cláusula MySQL LIMIT no Microsoft SQL Server 2000
Se você estiver usando o Microsoft SQL Server 2000, não há uma boa solução. A maioria das pessoas precisa recorrer à captura do resultado da consulta em uma tabela temporária com uma
IDENTITY
chave primária. Em seguida, consulte a coluna da chave primária usando umaBETWEEN
condição.Se você estiver usando o Microsoft SQL Server 2005 ou posterior, terá uma
ROW_NUMBER()
função, para obter o mesmo resultado, mas evite a tabela temporária.Você também pode escrever isso como uma expressão de tabela comum, como mostra a resposta de @Leon Tayson .
fonte
É assim que limito os resultados no MS SQL Server 2012:
NOTA:
OFFSET
só pode ser usado com ou em conjunto comORDER BY
.Para explicar a linha de código
OFFSET xx ROWS FETCH NEXT yy ROW ONLY
A
xx
é o número de registro / linha que deseja começar a puxar a partir da tabela, ou seja: se houver 40 registros na tabela 1, o código acima irá começar a puxar da linha 10.O
yy
é o número de registros / linhas que você deseja extrair da tabela.Para desenvolver o exemplo anterior: Se a tabela 1 possui 40 registros e você começou a puxar da linha 10 e pegue o conjunto NEXT de 10 (
yy
). Isso significa que o código acima extrairá os registros da tabela 1, iniciando na linha 10 e terminando em 20. Assim, extrair as linhas 10 - 20.Confira o link para obter mais informações sobre OFFSET
fonte
fonte
A consulta Sintatisticamente MySQL LIMIT é algo como isto:
Isso pode ser traduzido para o Microsoft SQL Server como
Agora sua consulta
select * from table1 LIMIT 10,20
será assim:fonte
Esta é uma das razões pelas quais tento evitar o uso do MS Server ... mas mesmo assim. Às vezes você simplesmente não tem uma opção (yei! E eu tenho que usar uma versão desatualizada !!).
Minha sugestão é criar uma tabela virtual:
De:
Para:
Em seguida, basta consultar:
Se os campos forem adicionados ou removidos, "linha" é atualizada automaticamente.
O principal problema com esta opção é que ORDER BY foi corrigido. Portanto, se você quiser uma ordem diferente, precisará criar outra exibição.
ATUALIZAR
Há outro problema com essa abordagem: se você tentar filtrar seus dados, eles não funcionarão conforme o esperado. Por exemplo, se você fizer:
WHERE fica limitado aos dados que estão nas linhas entre 10 e 20 (em vez de pesquisar todo o conjunto de dados e limitar a saída).
fonte
Essa é uma abordagem de várias etapas que funcionará no SQL2000.
fonte
fonte
Deve tentar. Na consulta abaixo, você pode ver agrupar, ordenar, Ignorar linhas e limitar linhas.
fonte
É o mesmo que
Aqui está um artigo sobre a implementação do Limit no MsSQL. É uma boa leitura, especialmente os comentários.
fonte
No SQL, não existe uma palavra-chave LIMIT. Se você precisar apenas de um número limitado de linhas, use uma palavra-chave TOP que seja semelhante a um LIMIT.
fonte
Se seu ID for do tipo identificador único ou se não for classificado na tabela, faça o seguinte abaixo.
O código será
fonte
--Dando a uma coluna [Count] e atribuindo a cada linha uma contagem única sem solicitar algo e selecione novamente onde você pode fornecer seus limites .. :)
fonte
Uma das maneiras possíveis de obter resultados como abaixo, espero que isso ajude.
fonte
Jeito fácil
MYSQL:
MSSQL:
ORDER BY é obrigatório
fonte
Se bem me lembro (já faz um tempo desde que me envolvi com o SQL Server), talvez você possa usar algo assim: (2005 e posteriores)
fonte
WHERE
um alias definido na mesmaSELECT
cláusula de nível .