将公共表表达式CTE的rowcount转换为用于分页的参数

时间:2009-11-19 16:06:35

标签: tsql paging

我的朋友在这里编写一个带有分页的数据网格的网页。我们能够将总页面数量作为窗口函数输入到列中,但是我们无法弄清楚如何将它放入参数中。看到代码会更有意义:

    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 )

我无法从上次选择中获取参数,因为当您还返回值时无法设置参数。我希望有一些方法可以做到这一点,但与此同时(这可能是一个同样好的解决方案)我们只是在数据集中返回这个并从数据集中提取代码中的页数而不是通过输出参数。合理?如果您知道将其纳入参数的方法,请告诉我们!谢谢!

3 个答案:

答案 0 :(得分:0)

不幸的是,所有的途径都减少了同样的事情:尝试在选择中设置一个值,同时输出数据,一个动词组合。使用输出参数进行总计数的最终解决方案是将分页数据插入表变量,这样就可以选择数据并设置输出参数。 (临时表也足够了。)

答案 1 :(得分:0)

我的回答是添加另一个cte,因为我要求将总数放在最后一行:

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

答案 2 :(得分:-1)

这个小改动应该这样做。

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