Requête SQL pour le pagging et sorting
Lorsque vous faites du pagging dans ASP.NET, vous tombez très rapidement dans la problématique qui consiste à dire : pour que mon Gridview puisse afficher que X lignes sur les 10 000 que je récupère je dois lui donner l'intégralité (les 10 000) des données.
Peu importe les technos (PHP, JAVA, .NET, etc.), la solution de contournement est de faire une requête qui ramène juste les lignes à afficher, le nombre de ligne total et la position des lignes affichés (numéro de "page").
Voici une structure de requête (sous forme de procédure stockée) qui fonctionne très bien avec les couples SQL Server 2005 (ou supérieur) et ASP.NET 2.0 (ou supérieur).
CREATE Procedure GetMyDatasPagingSorting ( @PARAM1 AS int @SortExpression AS NVARCHAR(50), -- L´expression sur laquel porte le trie @SortDirection AS NVARCHAR(4), -- Le sens du tri (ASC ou DESC) @StartRow AS INT, -- La première ligne à afficher (la 10 ème, par exemple) @PageSize AS INT, -- Le nombre de ligne à afficher @TotalRowCount AS INT OUTPUT -- Le nombre de ligne total que l´application doit récupérer ) AS
SET NOCOUNT ON;
-- Récupération des lignes souhaitées -- La fonction ROW_NUMBER() va permettre de numéroter le jeu de résultat WITH result AS ( SELECT ROW_NUMBER() OVER (ORDER BY CASE WHEN @SortExpression = ´NOM_COLONNE_1´ AND @SortDirection = ´ASC´ THEN NOM_COLONNE_1 END ASC, CASE WHEN @SortExpression = ´NOM_COLONNE_1´ AND @SortDirection = ´DESC´ THEN vhc_id END DESC, CASE WHEN @SortExpression = ´NOM_COLONNE_2´ AND @SortDirection = ´ASC´ THEN vhc_version END ASC, CASE WHEN @SortExpression = ´NOM_COLONNE_2´ AND @SortDirection = ´DESC´ THEN vhc_version END DESC, CASE WHEN @SortExpression = ´NOM_COLONNE_3´ AND @SortDirection = ´ASC´ THEN vhc_mileage END ASC, CASE WHEN @SortExpression = ´NOM_COLONNE_3´ AND @SortDirection = ´DESC´ THEN vhc_mileage END DESC, ) as ROW_NUMBER, NOM_COLONNE_1 ,NOM_COLONNE_2 ,NOM_COLONNE_3 FROM NOM_TABLE WHERE NOM_COLONNE_4 = @PARAM1 )
-- Récupération des lignes -- Grace au numéro de ligne, on est capable de ne récupérer que le jeu de donnée -- qui nous intéresse select NOM_COLONNE_1, NOM_COLONNE_2, NOM_COLONNE_3 FROM result WHERE ROW_NUMBER BETWEEN @StartRow + 1 AND @StartRow + @PageSize + 1;
-- Récupération du nombre de ligne -- Attention à bien utiliser la même requête avec les mêmes clause -- que lors de la numérotation des lignes SELECT @TotalRowCount = count(NOM_COLONNE_1) FROM NOM_TABLE WHERE NOM_COLONNE_4 = @PARAM1 |
Postée le 20/01/2009 par Aleks
Cette astuce est liée au projet
|