我的朋友正在使用具有分页功能的数据网格编写网页。我们能够将总页数作为窗口函数放入列中,但我们不知道如何将其放入参数中。看看代码会更有意义:
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 )
我无法从上次选择中获取参数,因为在返回值时无法设置参数。我希望有某种方法可以做到这一点,但与此同时(这可能是一个同样好的解决方案)我们只是在数据集中返回它,并从数据集中提取代码中的页数,而不是通过输出参数。有道理吗?如果您知道将其放入参数的方法,请告诉我!谢谢!
不幸的是,所有途径都归结为同一件事:尝试在选择中设置值,同时输出数据,这是一种禁止的组合。我对总计数使用输出参数的最终解决方案是将分页数据插入表变量中,这样就可以选择数据并设置输出参数。 (临时表也足够了。)
我的答案是添加另一个 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
这个小改变应该可以做到。
,COUNT(*) OVER(按 NULL 分区)AS [行计数]