SQL Server 2000 不支持 `ROW_NUMBER()` 窗口函數,也不支持 `WITH ... AS` (CTE) 公用表表達式。面對複雜的多表關聯、子查詢以及動態篩選條件,傳統的 `TOP N` 配合 `NOT IN` 或 `MAX(ID)` 等偏移分頁方式性能極差且難以維護。
利用遊標將查詢結果集暫存,根據頁碼和頁大小計算絕對位置,通過 `FETCH ABSOLUTE` 直接定位到目標記錄起始行,再逐行 `FETCH NEXT` 讀取頁面所需數據。雖然遊標屬於逐行處理,但在無窗口函數的舊版本中,這是實現任意複雜查詢分頁最通用、兼容性最強的方案。
-- 1. 宣告變量
DECLARE @PageSize INT = 20, @PageIndex INT = 3;
DECLARE @StartRow INT = (@PageIndex - 1) * @PageSize + 1;
DECLARE @EndRow INT = @PageIndex * @PageSize;
-- 2. 定義遊標(此處為簡化示例,實際應替換為你的複雜查詢)
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT a.autoid, a.callerid, a.doorid, a.cardday, a.eventtype
FROM Cr_CardEvent a, Cr_Caller_BasicInfo b
WHERE a.callerid = b.callerid AND b.callertype = 1
AND a.cardday BETWEEN '2011-09-01' AND '2011-09-02';
-- 3. 打開遊標並定位
OPEN cur;
FETCH ABSOLUTE @StartRow FROM cur; -- 直接跳轉到起始行
-- 4. 循環讀取當前頁數據
WHILE @@FETCH_STATUS = 0 AND @StartRow <= @EndRow
BEGIN
FETCH NEXT FROM cur INTO @autoid, @callerid, @doorid, @cardday, @eventtype;
-- 此處可將變量插入臨時表或直接返回給應用層
SET @StartRow = @StartRow + 1;
END
-- 5. 關閉釋放
CLOSE cur;
DEALLOCATE cur;