我试图做分页在SQL Server存储过程,就像这样:保留合计结果信息虽然分页在SQL Server
/*Assign a row number to each row*/
SELECT
ROW_NUMBER() OVER (ORDER BY A, B, C ASC) AS ROW_NUMBER,
A, B, C
FROM ABC
WHERE ROW_NUMBER BETWEEN @startRecordNumber and @endRecordNumber
但是,我的调用代码也想知道有多少结果在分页之前设置原始结果。所以,我将我的代码更改为:
/*Put the results into a temp table first*/
SELECT
ROW_NUMBER() OVER (ORDER BY A, B, C ASC) AS ROW_NUMBER,
A, B, C
INTO #TOTAL_RESULTS
FROM ABC
/*Get the total results from @@RowCount*/
declare @totalResults bigint
set @totalResults = @@RowCount
/*Now just get the desired page from the temp table*/
SELECT
A, B, C
FROM #TOTAL_RESULTS
WHERE ROW_NUMBER BETWEEN @startRecordNumber and @endRecordNumber
DROP TABLE #TOTAL_RESULTS
这让我觉得很迂回。有没有办法获得原始结果集的大小而不必创建临时表?也许只是一个公用表表达式而已?我似乎无法找到一种方法来做到这一点。
如果它的事项,这里是ABC的模式:
ABC
A(PK,SMALLINT NOT NULL)
B(PK,SMALLINT NOT NULL)
C(PK,SMALLINT NOT NULL)
我忘记了窗口集合,+1。 – 2011-02-26 18:11:39
嗯...好主意。所以,用我的方法,我可以将全部结果放在一个变量中,但我必须使用临时表。使用你的方法,你可以使用CTE,但是你必须调用Count()来获得总结果,而不是仅仅获取@@ RowCount中已有的结果。而且你必须返回结果集中每一行的Count字段......我真的不确定从性能的角度来看这是否更好。 – Tedderz 2011-02-26 18:24:17
@Tedderz - 从性能POV我不确定哪个最好。使用窗口化聚合函数为计划添加了一个假脱机,并且往往会增加很多逻辑读取次数。如果有一个避免假脱机的计划会更好,但到目前为止我不认为这是可能的。 – 2011-02-26 18:36:35