我試圖做分頁在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