56 votes

Comment faire de la pagination en SQL Server 2008

Comment faire de la pagination en SQL Server 2008 ?

3 votes

Il n'y a pas de MSSQL 2008. Tu voulais dire, "SQL Server 2008"

47voto

AdaTheDev Points 53358

Vous pouvez utiliser ROW_NUMBER() :

Renvoie le numéro séquentiel d'une ligne dans une partition d'un ensemble de résultats, en commençant par 1 pour la première ligne de chaque partition.

Exemple :

WITH CTEResults AS
(
    SELECT IDColumn, SomeField, DateField, ROW_NUMBER() OVER (ORDER BY DateField) AS RowNum
    FROM MyTable
)

SELECT * 
FROM CTEResults
WHERE RowNum BETWEEN 10 AND 20;

45voto

astander Points 83138

Vous pouvez essayer quelque chose comme

DECLARE @Table TABLE(
        Val VARCHAR(50)
)

DECLARE @PageSize INT,
        @Page INT

SELECT  @PageSize = 10,
        @Page = 2

;WITH PageNumbers AS(
        SELECT Val,
                ROW_NUMBER() OVER(ORDER BY Val) ID
        FROM    @Table
)
SELECT  *
FROM    PageNumbers
WHERE   ID  BETWEEN ((@Page - 1) * @PageSize + 1)
        AND (@Page * @PageSize)

0 votes

Je pense que ce code ne fonctionne pas. Avez-vous testé ce code ? (il devrait remplacer la table "PageNumbers" par la "@Table".

2 votes

@zeitgeist, il utilise un CTE appelé PageNumbers. Avez-vous testé le code tel quel ?

1 votes

Cet algorithme de pagination est faux. Avec les pages 1 et 2, il fonctionne, mais à partir de la page 3, il commence à sauter des entrées. La page 2 passe de 11 a 20 mais la page 3 passera de 22 a 30 saut d'entrée 21 .

19voto

Anton Gogolev Points 59794

Comme dans SQL Server 2005 .

15voto

MarceBozu Points 61

SQL Server 2012 offre une fonctionnalité de pagination (voir http://www.codeproject.com/Articles/442503/New-features-for-database-developers-in-SQL-Server )

En SQL2008, vous pouvez le faire de cette façon :

declare @rowsPerPage as bigint; 
declare @pageNum as bigint; 
set @rowsPerPage=25; 
set @pageNum=10;   

With SQLPaging As   ( 
    Select Top(@rowsPerPage * @pageNum) ROW_NUMBER() OVER (ORDER BY ID asc) 
    as resultNum, * 
    FROM Employee )
select * from SQLPaging with (nolock) where resultNum > ((@pageNum - 1) * @rowsPerPage)

Prooven ! Il fonctionne et s'adapte de manière cohérente.

0 votes

Le résultat peut être différent si vous vous débarrassez du haut. Cette méthode ne garantit pas le même résultat si vous supprimez top, sauf si les tables ont été triées par id.

3voto

Roman Boiko Points 2171

Ces deux articles contiennent les informations qui m'ont été utiles il y a quelque temps :

http://www.asp101.com/articles/gal/effectivepaging/default.asp , http://aspnet.4guysfromrolla.com/articles/031506-1.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X