2009-11-19 9 views
2

Mon ami codifie une page Web avec une grille de données qui a la pagination. Nous avons été en mesure d'obtenir le total de pagecount dans une colonne en tant que fonction de fenêtre, mais nous ne pouvons pas comprendre comment l'obtenir dans un paramètre. En voyant le code plus logique:Obtention du nombre de lignes d'une expression de table commune CTE dans un paramètre pour la pagination

DECLARE @StartRow INT 
    DECLARE @EndRow INT 
    DECLARE @PerPage INT 
    DECLARE @PageNumber int 
    SET @PerPage = 30 
    SET @PageNumber = 1 
    SET @StartRow = ((@PageNumber - 1) * @PerPage) + 1 
    SET @EndRow = ((@PageNumber) * @PerPage) ; 
    WITH cte 
       AS (SELECT ROW_NUMBER() OVER (ORDER BY Name) [row] 
          , Name 
          , COUNT(*) OVER () AS [rowcount] 
        FROM table) 

    SELECT row, Name, ([rowcount]/@PerPage) + 1 AS [pages] 
    FROM cte 
    WHERE row BETWEEN @StartRow AND @EndRow 
       OR (@PageNumber = -1) 

Je ne peux pas le paramètre de la dernière sélection parce que vous ne pouvez pas définir les paramètres lorsque vous êtes également le retour des valeurs. J'espérais qu'il y aurait un moyen de le faire mais en attendant (ce qui peut être une bonne solution), nous retournons juste cela dans l'ensemble de données et tirons le nombre de pages du code de l'ensemble de données au lieu d'un paramètre de sortie. Avoir du sens? Faites-moi savoir si vous connaissez un moyen d'obtenir ceci dans un paramètre! Merci!

Répondre

-1

Ce petit changement devrait le faire.

, COUNT (*) OVER (PARTITION BY NULL) AS [rowcount]

+0

Comment cela obtenir le nombre de lignes dans un paramètre? – pikes

0

Malheureusement, toutes les possibilités se réduisent à la même chose: essayer de définir une valeur dans une sélection tout en sortie des données, une combinaison verboten. Ma solution éventuelle à l'utilisation d'un paramètre de sortie pour le compte total était d'insérer les données paginées dans une variable de table, ce qui permettait à la fois de sélectionner les données et de définir le paramètre de sortie. (Une table temporaire aurait également suffi.)

0

Ma réponse était d'ajouter un autre cte, comme je l'avais reqirement mettre totale dans la dernière ligne:

Declare @Page INT 
SET @Page = 5 

;with MainData 
AS 
(
select 
    name 
from 
    sys.tables 
) 
,MainDataWithCount 
AS 
(
select 
    name 
    ,row_number() over (ORDER BY name) AS Row 
from 
    Maindata 
) 
select 
    MainDataWithCount.name 
    ,MainDataWithCount.Row 
    ,MainDataWithCount.row/@Page 
from 
    MainDataWithCount