Question

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

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

Ce que je veux dire par la pagination est, par exemple, si je fais la liste des utilisateurs par leur nom d'utilisateur, je veux être en mesure de retourner uniquement les 10 premiers enregistrements, puis les 10 prochaines dossiers et ainsi de suite.

Toute aide serait grandement appréciée.

Était-ce utile?

La solution

Vous pouvez utiliser the Row_Number() fonction.Il est utilisé comme suit:

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

Partir de laquelle il va produire un résultat défini avec une RowID champ que vous pouvez utiliser pour la page de 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

Autres conseils

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

L'on a accepté la réponse à cette question ne fait pas travailler pour moi...j'ai dû sauter à travers un plus hoop pour le faire fonctionner.

Quand j'ai essayé la réponse

SELECT Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
FROM Users
WHERE RowID Between 0 AND 9

il a échoué, se plaindre qu'il ne savait pas ce RowID a été.

J'ai eu l'envelopper dans un intérieur sélectionner comme ceci:

SELECT * 
FROM
    (SELECT
    Row_Number() OVER(ORDER BY UserName) As RowID, UserFirstName, UserLastName
    FROM Users
    ) innerSelect
WHERE RowID Between 0 AND 9

et puis il a travaillé.

Quand j'ai besoin de faire de la pagination, je l'utilise généralement une table temporaire en tant que bien.Vous pouvez utiliser un paramètre de sortie pour retourner le nombre total d'enregistrements.Le cas des états dans la sélection vous permettent de trier des données dans des colonnes spécifiques, sans avoir besoin de recourir à du 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

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

J'ai été en mesure d'accomplir ceci dans mon précédent poste à l'aide de l'aide à partir de cette page:La pagination en DotNet 2.0

Ils ont aussi en tirant un nombre de lignes séparément.

Voici ce que je fais pour la pagination:Tous mes grosses requêtes qui doivent être paginées sont codées comme des insertions dans une table temporaire.La table temp a un champ d'identité qui va agir d'une manière similaire à la fonction row_number() mentionnés ci-dessus.Je stocke le nombre de lignes dans la table temporaire dans un paramètre de sortie de sorte que le code appelant sait quel est le nombre total d'enregistrements.Le code d'appel précise également la page qu'il veut, et le nombre de lignes par page, qui sont sélectionnés à partir de la table temporaire.

La chose cool à propos de cette façon de faire, c'est que j'ai aussi une "Exportation" lien qui vous permet d'obtenir toutes les lignes de la déclaration retournée au format CSV au-dessus de chaque grille dans mon application.Ce lien utilise la même procédure stockée:vous venez de retourner le contenu de la table temp au lieu de faire de la pagination de la logique.Cela apaise les utilisateurs qui déteste la pagination, et que vous voulez voir tout, et à trier dans un million de différentes façons.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top