将公共表表达式CTE的rowcount获取到参数中进行分页

问题描述 投票:0回答:3

我的朋友正在使用具有分页功能的数据网格编写网页。我们能够将总页数作为窗口函数放入列中,但我们不知道如何将其放入参数中。看看代码会更有意义:

    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 )

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

t-sql pagination
3个回答
0
投票

不幸的是,所有途径都归结为同一件事:尝试在选择中设置值,同时输出数据,这是一种禁止的组合。我对总计数使用输出参数的最终解决方案是将分页数据插入表变量中,这样就可以选择数据并设置输出参数。 (临时表也足够了。)


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

-1
投票

这个小改变应该可以做到。

,COUNT(*) OVER(按 NULL 分区)AS [行计数]

© www.soinside.com 2019 - 2024. All rights reserved.