Paging SQL Server 2005 Résultats

voix
36

Comment les résultats I page dans SQL Server 2005?

Je l'ai essayé dans SQL Server 2000, mais il n'y avait aucun moyen fiable de le faire. Je demande maintenant si SQL Server 2005 a tout construit dans la méthode?

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

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

Créé 05/08/2008 à 21:57
source utilisateur
Dans d'autres langues...                            


6 réponses

voix
33

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

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

D'où il donnera un jeu de résultats avec un RowIDchamp que vous pouvez utiliser à la page entre les deux.

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

etc

Créé 05/08/2008 à 21:59
source utilisateur

voix
13

Si vous essayez de l'obtenir dans une instruction (le total ainsi que la recherche de personnes). Vous pourriez avoir besoin d'explorer le support SQL Server pour la partition par clause (fonctions de fenêtrage en ANSI termes SQL). Dans Oracle la syntaxe est comme l'exemple ci-dessus en utilisant row_number (), mais je l'ai également ajouté une partition par clause pour obtenir le nombre total de lignes incluses avec chaque ligne retournée dans la recherche de personnes (nombre total de lignes est 1262):

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 où le propriétaire = « CSEIS » et ma partition en est le propriétaire. Ainsi, 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
Créé 14/08/2008 à 18:15
source utilisateur

voix
5

La réponse acceptée pour cela ne fonctionne pas vraiment pour moi ... je devais sauter à travers un cerceau plus 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 plaignant qu'il ne savait pas ce qui était RowID.

Je devais 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

puis il a travaillé.

Créé 15/04/2009 à 18:56
source utilisateur

voix
2

Quand je dois faire radiomessagerie, j'utilise généralement une table temporaire aussi bien. Vous pouvez utiliser un paramètre de sortie pour renvoyer le nombre total d'enregistrements. Les déclarations de cas dans la sélection vous permettent de trier les données sur des colonnes spécifiques sans avoir besoin de recourir à 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 IGNORE  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
Créé 16/09/2008 à 17:17
source utilisateur

voix
0

Voilà ce que je fais pour la pagination: Toutes mes grandes questions qui doivent être paginée sont codés comme des insertions dans une table temporaire. La table temporaire a un champ d'identité qui va agir d'une manière similaire à la row_number () mentionné ci-dessus. Je stocke le nombre de lignes dans la table temporaire dans un paramètre de sortie de sorte que le code d'appel sait combien de dossiers au total il y a. Le code d'appel précise également quelle page il veut, et le nombre de lignes par page, qui sont sélectionnés à partir de la table temporaire.

Ce qui est cool cette façon de faire est que j'ai aussi un lien « Exporter » qui vous permet d'obtenir toutes les lignes du rapport est revenu au format CSV ci - dessus chaque grille dans ma demande. Ce lien utilise la même procédure stockée: vous revenez juste le contenu de la table temporaire au lieu de faire la logique d'échange. Ce qui détestent les utilisateurs apaise radiomessagerie, et veulent voir tout , et que vous voulez faire le tri dans un million de façons différentes.

Créé 13/08/2008 à 15:16
source utilisateur

voix
0

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

Je suis en mesure d'accomplir cela à ma position précédente à l' aide de l' aide de cette page: Paging en DotNet 2.0

Ils ont aussi tirer une ligne compte séparement.

Créé 05/08/2008 à 22:05
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more