随笔 - 1330  文章 - 1  评论 - 378  阅读 - 482万 
过去用SQL Server 2000分页的,大多都用到了临时表。SQL Server 2005 ROW_NUMBER 函数支持分页,性能据说也非常不错。

Paging Records Using SQL Server 2005 Database
Paging in SQL Server 2005

Sql Server 2005自定义分页

最近MSDN Magazine上的一篇文章10 Tips for Writing High-Performance Web Applications提到了有效的数据分页技术对提高ASP .NET程序性能的重要性;并给出了一个实现数据分页的stored procedure的例子,抄录如下:

 

 

复制代码
CREATE PROCEDURE northwind_OrdersPaged

(
    
@PageIndex int
    
@PageSize int
)

AS
BEGIN
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int
-- First set the rowcount
SET @RowsToReturn = @PageSize * (@PageIndex + 1)
SET ROWCOUNT @RowsToReturn
-- Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1
-- Create a temp table to store the select results
CREATE TABLE #PageIndex 
(
    IndexId 
int IDENTITY (11NOT NULL,
    OrderID 
int
)
-- Insert into the temp table
INSERT INTO #PageIndex (OrderID)
SELECT 
    OrderID
FROM 
    Orders
ORDER BY 
    OrderID 
DESC
-- Return total count
SELECT COUNT(OrderID) FROM Orders
-- Return paged results
SELECT 
    O.
*
FROM 
    Orders O,
    #PageIndex PageIndex
WHERE 
    O.OrderID 
= PageIndex.OrderID AND
    PageIndex.IndexID 
> @PageLowerBound AND
    PageIndex.IndexID 
< @PageUpperBound
ORDER BY 
    PageIndex.IndexID
END 
复制代码


    在SQL Server 2000里面,由于没有一个有效的进行ranking操作的方法,所以该例子先创建了一个有Identity字段的临时表,利用Identity字段的自增长特性,间接的为Orders表的每一行按orderID逆序赋予了一个行号, 然后基于这个行号实现分页。

在SQL Server 2005里面,由于系统提供了内建的ranking函数,为了给Orders表生成行号,我们不再需要利用Identity字段。

例如,利用SQL Server 2005的ROW_NUMBER()函数,按orderID字段逆序排列,给Orders表生成行号的语句如下:
 

 

SELECT ROW_NUMBER() OVER(ORDER BY ordered DESCAS rownum, ordered

FROM Orders

ORDER BY rownum DESC

基于这些新的ranking函数,您可以跟方便的实现数据的分页操作。

关于SQL Server 2005的T-SQL新特性,见文档:

http://msdn.microsoft.com/sql/archive/default.aspx?pull=/library/en-us/dnsql90/html/sql_05tsqlenhance.asp

posted on   钱途无梁  阅读(596)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示