SQL Server中獲取指定范圍分頁取數(shù)的兩種方式
引言
在 SQL Server 中獲取指定范圍的記錄(分頁/分批取數(shù)),核心依賴 OFFSET/FETCH(SQL Server 2012+ 推薦)和 ROW_NUMBER() 函數(shù)(兼容低版本),以下是兩種主流方式的詳細實現(xiàn),結(jié)合 FDQuery 適配場景說明:
一、推薦方式:OFFSET/FETCH(SQL Server 2012+)
語法簡潔、性能優(yōu),是官方推薦的分頁語法,適配 FDQuery 分批取數(shù)場景。
基礎語法
SELECT 字段列表 FROM 表名 ORDER BY 排序字段 -- 必須指定 ORDER BY,否則OFFSET/FETCH 無效 OFFSET 偏移量 ROWS -- 跳過前 N 行(偏移量 = (頁碼-1)*每頁行數(shù)) FETCH NEXT 行數(shù) ROWS ONLY; -- 取后續(xù) N 行
示例1:基礎分頁(適配 FDQuery 手動分批)
// Delphi + FDQuery 示例:加載第3頁,每頁20行
procedure TForm1.LoadSQLServerPage(PageIndex: Integer; PageSize: Integer);
var
OffsetNum: Integer;
begin
OffsetNum := (PageIndex - 1) * PageSize; // 計算偏移量(第1頁偏移0,第2頁偏移20...)
FDQuery1.Close;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Text := Format(
'SELECT id, name, class_id, grade ' +
'FROM t_student ' +
'ORDER BY id ' + // 必須排序,建議用主鍵/索引字段
'OFFSET %d ROWS ' +
'FETCH NEXT %d ROWS ONLY',
[OffsetNum, PageSize]
);
FDQuery1.Open;
end;
// 調(diào)用:加載第3頁,每頁20行
LoadSQLServerPage(3, 20);示例2:取前 N 行(簡化版)
若僅需取前100行,可省略 OFFSET:
SELECT TOP 100 id, name FROM t_student ORDER BY id; -- 等價于 SELECT id, name FROM t_student ORDER BY id OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY;
二、兼容低版本:ROW_NUMBER() 函數(shù)(SQL Server 2005+)
若需兼容 SQL Server 2005/2008 等低版本,用 ROW_NUMBER() 生成行號,再篩選行號范圍。
基礎語法
SELECT TOP 100 id, name FROM t_student ORDER BY id; -- 等價于 SELECT id, name FROM t_student ORDER BY id OFFSET 0 ROWS FETCH NEXT 100 ROWS ONLY;
示例:適配 FDQuery 分批取數(shù)
procedure TForm1.LoadSQLServerByRowNum(PageIndex: Integer; PageSize: Integer);
var
StartRow, EndRow: Integer;
begin
StartRow := (PageIndex - 1) * PageSize + 1; // 起始行號(第1頁:1,第2頁:21...)
EndRow := PageIndex * PageSize; // 結(jié)束行號(第1頁:20,第2頁:40...)
FDQuery1.Close;
FDQuery1.SQL.Clear;
FDQuery1.SQL.Text := Format(
'SELECT id, name, class_id, grade FROM (' +
' SELECT ' +
' id, name, class_id, grade, ' +
' ROW_NUMBER() OVER (ORDER BY id) AS RowNum ' +
' FROM t_student ' +
') AS Temp ' +
'WHERE Temp.RowNum BETWEEN %d AND %d',
[StartRow, EndRow]
);
FDQuery1.Open;
end;
// 調(diào)用:加載第2頁,每頁15行
LoadSQLServerByRowNum(2, 15);三、關鍵注意事項(適配 FDQuery 場景)
必須排序:OFFSET/FETCH 和 ROW_NUMBER() 都依賴 ORDER BY,否則行號/偏移量無意義,建議用主鍵(如 id)或索引字段排序,提升性能;
性能優(yōu)化:
- 給排序字段加索引(如
CREATE INDEX idx_student_id ON t_student(id)); - 避免
SELECT *,僅查詢需要的字段,減少數(shù)據(jù)傳輸;
邊界處理:若偏移量超過總記錄數(shù),查詢返回空結(jié)果,可先查總記錄數(shù)再判斷:
-- 查總記錄數(shù)(適配 FDQuery 統(tǒng)計總數(shù)) SELECT COUNT(*) FROM t_student WHERE grade = '2025級';
FDQuery 分批適配:
- 若用「自動分批」(FetchOptions.RowsetSize),F(xiàn)DQuery 會自動拼接 OFFSET/FETCH 語法(無需手動寫分頁);
- 若用「手動分頁控件」,優(yōu)先用 OFFSET/FETCH 語法(代碼更簡潔)。
四、對比:兩種方式的適用場景
| 方式 | 優(yōu)點 | 缺點 | 適用版本 |
| OFFSET/FETCH | 語法簡潔、性能優(yōu) | 僅支持 SQL Server 2012+ | 2012 及以上 |
| ROW_NUMBER() | 兼容低版本 | 嵌套查詢,語法稍復雜 | 2005 及以上 |
五、FDQuery 自動分批適配(無需手動寫分頁)
若無需手動控制頁碼,僅需“滾動加載”分批取數(shù),可直接配置 FDQuery 的 FetchOptions,F(xiàn)ireDAC 會自動適配 SQL Server 的分批語法:
procedure TForm1.FDQueryAutoBatch;
begin
FDQuery1.Close;
FDQuery1.SQL.Text := 'SELECT id, name, class_id FROM t_student ORDER BY id';
with FDQuery1.FetchOptions do
begin
Mode := fmAll; // 按需加載
RowsetSize := 50; // 每批加載50行
AutoFetchAll := False; // 禁止一次性加載全量
end;
FDQuery1.Open; // 首次加載50行,滾動到底部自動加載下一批
end;如果需要結(jié)合“多表關聯(lián)查詢+分頁”“帶條件篩選的范圍取數(shù)”等場景,可補充具體需求,我會給出針對性示例。
以上就是SQL Server中獲取指定范圍分頁取數(shù)的兩種方式的詳細內(nèi)容,更多關于SQL Server指定范圍分頁取數(shù)的資料請關注腳本之家其它相關文章!
相關文章
sqlserver 樹形結(jié)構(gòu)查詢單表實例代碼
這篇文章主要介紹了 sqlserver 樹形結(jié)構(gòu)查詢單表的實例代碼,需要的朋友可以參考下2017-08-08
sql update 觸發(fā)器 可獲得被update的行的信息
sql update 觸發(fā)器 可獲得被update的行的信息,需要的朋友可以參考下。2010-06-06
SQL Server 中調(diào)整自增字段的當前初始值
SQL Server 中調(diào)整自增字段的當前初始值...2007-01-01
如何快速刪掉SQL Server登錄時登錄名下拉列表框中的選項
本文給大家分享如何快速刪掉SQL Server登錄時登錄名下拉列表框中的選項,包括問題原因分析和解決方案,非常不錯,需要的朋友參考下吧2016-11-11
強制SQL Server執(zhí)行計劃使用并行提升在復雜查詢語句下的性能
最近在給一個客戶做調(diào)優(yōu)的時候發(fā)現(xiàn)一個很有意思的現(xiàn)象,對于一個復雜查詢(涉及12個表)建立必要的索引后,語句使用的IO急劇下降,但執(zhí)行時間不降反升,由原來的8秒升到20秒。2014-07-07
sqlserver數(shù)據(jù)庫導入方法的詳細圖文教程
導入數(shù)據(jù)也是數(shù)據(jù)庫操作中使用頻繁的功能,下面這篇文章主要給大家介紹了關于sqlserver數(shù)據(jù)庫導入方法的詳細圖文教程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-10-10
使用SSIS創(chuàng)建同步數(shù)據(jù)庫數(shù)據(jù)任務的方法
SSIS(SQL Server Integration Services)是用于生成企業(yè)級數(shù)據(jù)集成和數(shù)據(jù)轉(zhuǎn)換解決方案的平臺。使用 Integration Services 可解決復雜的業(yè)務問題,具體表現(xiàn)為:復制或下載文件,發(fā)送電子郵件以響應事件,更新數(shù)據(jù)倉庫,清除和挖掘數(shù)據(jù)以及管理 SQL Server 對象和數(shù)據(jù)2012-09-09

