陋室铭
永远也不要停下学习的脚步(大道至简至易)

posts - 2169,comments - 570,views - 413万

原文:http://beyondrelational.com/modules/29/presentations/483/scripts/12983/sql-server-2012-server-side-paging-demo-using-offsetfetch-next.aspx?utm_source=brnewsletter&utm_medium=email&utm_campaign=2012Apr

 

SQL Server 2005 引入了 ROW_NUMBER()来提供一种容易的分页方式。 SQL Server 2012 添加了另外一种更简单高效的分页方式。

  1.  
    /*
  2.  
    执行脚本去创建这个表并插入数据。
  3.  
    */
  4.  
    IF OBJECT_ID('Customers','U') IS NOT NULL
  5.  
    DROP TABLE Customers
  6.  
     
  7.  
    CREATE TABLE Customers (
  8.  
    CustomerID INT,
  9.  
    CustomerNumber CHAR(4),
  10.  
    CustomerName VARCHAR(50),
  11.  
    CustomerCity VARCHAR(20) )
  12.  
    GO
  13.  
     
  14.  
    INSERT INTO Customers (
  15.  
    CustomerID, CustomerNumber, CustomerName, CustomerCity
  16.  
    )
  17.  
    SELECT
  18.  
    Number,
  19.  
    REPLACE(STR(Number, 4), ' ', '0'),
  20.  
    'Customer ' + STR(number,6),
  21.  
    CHAR(65 + (number % 26)) + '-City'
  22.  
    FROM master..spt_values WHERE type = 'p'
  23.  
    AND number BETWEEN 0 AND 999
  24.  
     
  25.  
    /*
  26.  
    用ROW_NUMBER()的分页示例- SQL Server 2005/2008 版本。
  27.  
    */
  28.  
     
  29.  
    DECLARE @page INT, @size INT
  30.  
    SELECT @page = 3, @size = 10
  31.  
     
  32.  
    ;WITH cte AS (
  33.  
    SELECT TOP (@page * @size)
  34.  
    CustomerID,
  35.  
    CustomerName,
  36.  
    CustomerCity,
  37.  
    ROW_NUMBER() OVER(ORDER BY CustomerName ) AS Seq,
  38.  
    COUNT(*) OVER(PARTITION BY '') AS Total
  39.  
    FROM Customers
  40.  
    WHERE CustomerCity IN ('A-City','B-City')
  41.  
    ORDER BY CustomerName ASC
  42.  
    )
  43.  
    SELECT
  44.  
    *
  45.  
    FROM cte
  46.  
    WHERE seq BETWEEN (@page - 1 ) * @size + 1 AND @page * @size
  47.  
    ORDER BY seq
  48.  
     
  49.  
    /*
  50.  
    SQL Server 2012中新添加的分页示例
  51.  
    */
  52.  
     
  53.  
    DECLARE @page INT, @size INT
  54.  
    SELECT @page = 3, @size = 10
  55.  
     
  56.  
    SELECT
  57.  
    *,
  58.  
    COUNT(*) OVER(PARTITION BY '') AS Total
  59.  
    FROM Customers
  60.  
    WHERE CustomerCity IN ('A-City','B-City')
  61.  
    ORDER BY CustomerID
  62.  
    OFFSET (@page -1) * @size ROWS
  63.  
    FETCH NEXT @size ROWS ONLY;
  64.  
     
  65.  
    /*
  66.  
    同时执行这两个版本,打开执行计划,你可以注意到在这个例子中显著的性能差异。
  67.  
    */
posted on   宏宇  阅读(345)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-07-25 SVN提交小结
2012-07-25 网络带宽大小和硬盘大小
2011-07-25 linq的常用写法
2008-07-25 使用 .NET Framework 2.0 在您的应用程序中支持证书(转)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示