IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Pagination d'une requête sur SQL Azure


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 62
    Par défaut Pagination d'une requête sur SQL Azure
    Bonjour !

    J'ai une procédure stockée qui me renvoie les résultats d'une recherche et qui se limite à n'en renvoyer que X grâce à un paramètre StartRow et et à un autre paramètre RowCount.

    Avec SQL Azure, on peut profiter de OFFSET / FETCH NEXT comme dans SQL Server 2012 et cela fonctionne très bien... Par contre, je me pose une question sur le meilleur moyen de retourner le nombre de pages au total...

    Actuellement, voici une version simplifiée de ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT B.Id [, ...]
    FROM GeoPC A JOIN Maison_Location B
    ON LocationId = A.Id
    ORDER BY B.Id
    OFFSET @StartRow ROWS
    FETCH NEXT @RowCount ROWS ONLY;
    (j'ai retiré les différentes conditions, éléments du SELECT, etc.)

    Nous avons donc de quoi retourner mes éléments !
    Le problème, c'est de savoir comment retourner le nombre de pages qu'il y a au total !

    J'ai deux solutions :

    - soit je fais une seconde requête avec exactement les mêmes conditions et je fais un COUNT(Id) que je place en paramètre de retour. --> j'ai pas mal de conditions dans la requête, c'est embêtant pour la maintenance du code de répercuter les changements sur les deux requêtes à chaque fois....

    - soit je rajoute un élément à mon SELECT de ma première requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT B.Id [, ...], COUNT(B.Id) OVER () As NumberOfPages
    Avec la deuxième solution, je n'ai qu'une requête à maintenir mais je n'avais jamais utilisé ça auparavant et je ne sais pas si c'est une bonne solution pour mon cas...

    Quel est le meilleur choix ? Y en a-t-il d'autres ?

    Un grand merci d'avance !

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Dans votre cas vous n'avez besoin que de récupérer le nombre de pages une seule fois. Par conséquent je n'adopterai pas la seconde solution car à chaque fois que vous allez récupérer votre fenêtre de données vous allez également recompter le nombre total de lignes renvoyés par votre requêt.

    Un autre axe de réflexion :
    Je suppose que vous voulez avoir le nombre de pages pour pouvoir l'afficher dans votre interface client. Une autre solution est simplement de pouvoir afficher des flèches de navigation. Dans ce cas pas besoin de compter le nombre de pages mais simplement récupérer votre fenêtre de données de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @PageSize TINYINT = 20; 
    DECLARE @CurrentPage INT = 1500;
     
    SELECT B.Id [, ...]
    FROM GeoPC A JOIN Maison_Location B
    ON LocationId = A.Id
    ORDER BY B.Id
    OFFSET (@PageSize * (@CurrentPage - 1)) ROWS    FETCH NEXT @PageSize ROWS ONLY;
    ++

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 62
    Par défaut
    Merci bien pour votre réponse !

    Dans mon cas, je dois afficher le nombre de page, une partie des pages suivantes/précédentes et un bouton suivant/précédent selon l'endroit où on se trouve dans la pagination...

    Donc il vaut mieux répéter la requête avec un COUNT(Id) sans la partie OFFSET/FETCH NEXT plutôt que d'utiliser la technique du COUNT(B.Id) OVER () ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/07/2013, 22h39
  2. [AC-2003] Traduction en VBA d'une requête Sélection SQL sur plusieurs tables
    Par Pucho Faritas dans le forum VBA Access
    Réponses: 9
    Dernier message: 29/10/2009, 10h32
  3. avis sur génération d'une requête INSERT (sql)
    Par MatthieuQ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2009, 10h17
  4. [SQL] Une requête sur 2 tables
    Par jf63000 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/10/2007, 12h50
  5. [SQL] Afficher les résultats d'une requête sur plusieurs pages
    Par mealtone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/09/2006, 13h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo