Pagination de SQL Server 2005 Résultats
-
08-06-2019 - |
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.
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.