最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL Server中獲取指定范圍分頁取數(shù)的兩種方式

 更新時間:2025年12月21日 11:25:37   作者:蟈蟈(GuoGuo)  
在SQL Server中獲取指定范圍的記錄(分頁/分批取數(shù)),核心依賴 OFFSET/FETCH(SQL Server 2012+ 推薦)和 ROW_NUMBER() 函數(shù)(兼容低版本),以下是兩種主流方式的詳細實現(xiàn),需要的朋友可以參考下

引言

在 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)化

  1. 給排序字段加索引(如 CREATE INDEX idx_student_id ON t_student(id));
  2. 避免 SELECT *,僅查詢需要的字段,減少數(shù)據(jù)傳輸;

邊界處理:若偏移量超過總記錄數(shù),查詢返回空結(jié)果,可先查總記錄數(shù)再判斷:

-- 查總記錄數(shù)(適配 FDQuery 統(tǒng)計總數(shù)) 
SELECT COUNT(*) FROM t_student WHERE grade = '2025級';

FDQuery 分批適配

  1. 若用「自動分批」(FetchOptions.RowsetSize),F(xiàn)DQuery 會自動拼接 OFFSET/FETCH 語法(無需手動寫分頁);
  2. 若用「手動分頁控件」,優(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ù)的資料請關注腳本之家其它相關文章!

相關文章

最新評論

宁武县| 上思县| 侯马市| 潜山县| 涿州市| 雅安市| 定远县| 花莲县| 延边| 乌鲁木齐市| 双牌县| 屏边| 徐闻县| 香港 | 丹寨县| 南宁市| 孙吴县| 蓬溪县| 贺州市| 墨玉县| 福建省| 莱西市| 沽源县| 白水县| 崇仁县| 高平市| 县级市| 巴南区| 辽阳市| 金川县| 枣强县| 江油市| 喀什市| 黄山市| 河池市| 秦皇岛市| 嘉黎县| 临西县| 方城县| 临高县| 台中市|