42 votes

Résultats de pagination SQL Server 2005

Comment puis-je mettre en page des résultats dans SQL Server 2005?

Je l'ai essayé dans SQL Server 2000, mais il n'y avait aucun moyen fiable de le faire. Je me demande maintenant si SQL Server 2005 a une méthode intégrée?

Par pagination, je veux dire, par exemple, si je liste les utilisateurs par leur nom d’utilisateur, je veux pouvoir ne renvoyer que les 10 premiers enregistrements, puis les 10 prochains enregistrements, etc.

Toute aide serait très appréciée.

36voto

Pat Points 3464

Vous pouvez utiliser la fonction the Row_Number() . Son utilisé comme suit:

 SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
 

À partir de quoi il donnera un ensemble de résultats avec un champ RowID que vous pouvez utiliser pour faire une page entre.

 SELECT * 
FROM 
    ( SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
      FROM Users 
    ) As RowResults
WHERE RowID Between 5 AND 10
 

etc

13voto

Brian Points 7072

Si vous essayez de le faire en une seule instruction (au total, en plus de la pagination). Vous pourriez avoir besoin d'explorer de support de SQL Server pour la partition par la clause de fenêtrage fonctions ANSI SQL termes). Dans Oracle, la syntaxe est juste comme dans l'exemple ci-dessus à l'aide de la fonction row_number(), mais j'ai aussi ajouté une partition par la clause pour obtenir le nombre total de lignes incluses avec chaque ligne renvoyée dans la pagination (total des lignes est de 1 262):

SELECT rn, total_rows, x.OWNER, x.object_name, x.object_type
  FROM (SELECT COUNT (*) OVER (PARTITION BY owner) AS TOTAL_ROWS,
               ROW_NUMBER () OVER (ORDER BY 1) AS rn, uo.*
          FROM all_objects uo
         WHERE owner = 'CSEIS') x
 WHERE rn BETWEEN 6 AND 10

Notez que j'ai where owner = 'CSEIS" et ma partition en est propriétaire. De sorte que les résultats sont les suivants:

RN  TOTAL_ROWS  OWNER   OBJECT_NAME OBJECT_TYPE
6   1262    CSEIS   CG$BDS_MODIFICATION_TYPES   TRIGGER
7   1262    CSEIS   CG$AUS_MODIFICATION_TYPES   TRIGGER
8   1262    CSEIS   CG$BDR_MODIFICATION_TYPES   TRIGGER
9   1262    CSEIS   CG$ADS_MODIFICATION_TYPES   TRIGGER
10  1262    CSEIS   CG$BIS_LANGUAGES    TRIGGER

5voto

Beska Points 6717

La réponse acceptée pour cela ne fonctionne pas réellement pour moi ... J'ai dû sauter à travers un cerceau de plus pour le faire fonctionner.

Quand j'ai essayé la réponse

il a échoué, se plaignant qu'il ne savait pas ce que RowID était.

J'ai dû l'envelopper dans un intérieur sélectionnez comme ceci:

et puis ça a marché.

2voto

Andrew Burgess Points 3053

Lorsque j’ai besoin de faire de la pagination, j’utilise aussi généralement une table temporaire. Vous pouvez utiliser un paramètre de sortie pour renvoyer le nombre total d'enregistrements. Les instructions case de la sélection vous permettent de trier les données sur des colonnes spécifiques sans avoir à recourir au SQL dynamique.

 --Declaration--

--Variables
@StartIndex INT,
@PageSize INT,
@SortColumn VARCHAR(50),
@SortDirection CHAR(3),
@Results INT OUTPUT

--Statements--
SELECT @Results = COUNT(ID) FROM Customers
WHERE FirstName LIKE '%a%'

SET @StartIndex = @StartIndex - 1 --Either do this here or in code, but be consistent
CREATE TABLE #Page(ROW INT IDENTITY(1,1) NOT NULL, id INT, sorting_1 SQL_VARIANT, sorting_2 SQL_VARIANT)
INSERT INTO #Page(ID, sorting_1, sorting_2)
SELECT TOP (@StartIndex + @PageSize)
    ID,
    CASE
    	WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN CAST(FirstName AS SQL_VARIANT)
    	WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN CAST(LastName AS SQL_VARIANT)
    	ELSE NULL
    END AS sort_1,
    CASE
    	WHEN @SortColumn='FirstName' AND @SortDirection='DES' THEN CAST(FirstName AS SQL_VARIANT)
    	WHEN @SortColumn='LastName' AND @SortDirection='DES' THEN CAST(LastName AS SQL_VARIANT)
    	ELSE NULL
    END AS sort_2
FROM (
    SELECT
    	CustomerId AS ID,
    	FirstName,
    	LastName
    FROM Customers
    WHERE
    	FirstName LIKE '%a%'
) C
ORDER BY sort_1 ASC, sort_2 DESC, ID ASC;

SELECT
    ID,
    Customers.FirstName,
    Customers.LastName
FROM #Page
INNER JOIN Customers ON
    ID = Customers.CustomerId
WHERE ROW > @StartIndex AND ROW <= (@StartIndex + @PageSize)
ORDER BY ROW ASC

DROP TABLE #Page
 

0voto

Pat Points 3464

Je crois que vous auriez besoin d'effectuer une requête distincte pour accomplir cela malheureusement.

J'ai pu accomplir cela à mon poste précédent en utilisant l'aide de cette page: Paging dans DotNet 2.0

Ils l'ont également en train de tirer un nombre de lignes séparément.

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