J'essaie de faire quelque chose comme :
SELECT * FROM table LIMIT 10,20
o
SELECT * FROM table LIMIT 10 OFFSET 10
mais en utilisant SQL Server
Le seul solution que j'ai trouvée c'est un peu exagéré :
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
J'ai aussi trouvé :
SELECT TOP 10 * FROM stuff;
... mais ce n'est pas ce que je veux faire puisque je ne peux pas spécifier la limite de départ.
Y a-t-il un autre moyen de le faire ?
Par ailleurs, par curiosité, y a-t-il une raison pour laquelle le serveur SQL ne prend pas en charge l'option LIMIT
ou quelque chose de similaire ? Je ne veux pas être méchant, mais cela ressemble vraiment à quelque chose dont un SGBD a besoin ... Si c'est le cas, alors je suis désolé d'être si ignorant ! Je travaille avec MySQL et SQL+ depuis 5 ans donc...
1 votes
Utilisation d'un CTE pour
ROW_NUMBER()
et en limitant avecTOP
pour la largeur de la plage et unWHERE
pour une limite de la plage est le meilleur résultat que j'ai pu obtenir. J'ai également remarqué que les performances étaient bien meilleures si le paramètreTOP
utilise un littéral au lieu d'une variable0 votes
Le problème avec toute solution impliquant ROW_NUMBER() est que si vous ne savez pas à l'avance quelles colonnes vous aurez, et que vous avez des jointures, et que les tables jointes ont le même nom de colonne, vous obtiendrez un "La colonne 'xxx' a été spécifiée plusieurs fois". Ce n'est pas aussi rare que cela puisse paraître. J'utilise Dapper, et mes tables ont toutes une colonne Id. Dapper divise et mappe sur cette colonne, je ne veux donc pas les renommer, mais je ne peux pas utiliser l'alias SELECT * FROM ([requête originale]). Je n'ai pas encore trouvé de solution !
0 votes
Duplicata possible de Comment implémenter LIMIT avec Microsoft SQL Server ?