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

 

Commentaires

Pas de commentaires

Si vous souhaitez ajouter un commentaire vous devez être authentifié.

Les autres Astuces

17/08 04:40 Linq : Inclure les tables de référence dans le résultat de vos requêtes 8321 Hits
23/02 04:29 Team Foundation : Ajouter une image dans un champs HTML depuis Team Explorer 9017 Hits
20/01 11:27 Requête SQL pour le pagging et sorting 8211 Hits
15/01 02:26 GridView et Sorting avec un custom header template 7344 Hits
18/04 05:47 SQL Server 2005 : Fonctions très utiles (surtout pour la BI) 21003 Hits
27/03 03:30 Obtenir la taille d'un fichier 11466 Hits
14/02 02:53 Gérer les DBNull dans les DataSet Typés 10733 Hits
14/11 03:34 Connaissez-vous String.Join(String, String[]) ? 13611 Hits
15/05 05:06 SQL : Convertir un float en nvarchar 16997 Hits
14/03 07:36 Optimisation : Le for 15270 Hits

1 2 3 4 5 6

 

ASP-PHP.NET  C²I  ClubVSTS  CodePPC  CodeS-SourceS  Dotnet-News.com  Tech Head Brothers 

Dotnet-Project.com© tous droits réservés
Webmaster Aleks. Ont collaboré à l'aboutissement de ce projet :
CodeS-SourceS.com, ASP-PHP.Net, DotNet-FR.org, C2i.fr, Newsletter ASP.NET.