以前经常被人家问 SQL server 如何实现分页?当一张表里面有数十万条或者更多的数据时,该怎么办?如果数据库是 SQL Server 2000,我会回答:TOP,使用 TOP 嵌套查询(或者临时表),如果是 SQL Server 2005/2008,我会回答:使用 WITH,ROW_NUMBER 和 OVER。
SQL Top
SQL Top,返回结果集中的前 N 条记录。下面的例子是返回订单量最多的前十位客户的信息。另外 TOP 关键字还可以根据百分比来返回结果,但是这里不作讨论。
SELECT TOP 10 * FROM Customers -- 这是一个最简单的例子
--下面是返回订单量最大的 10 位客户的信息
SELECT TOP 10 Customers.CustomerID, Customers.CompanyName, COUNT(*) OrderCount
FROM Customers INNER JOIN Orders ON Orders.CustomerID = Customers.CustomerID
GROUP BY Customers.CustomerID, Customers.CompanyName
ORDER BY OrderCount DESC
这种方法很容易就得到了前 10 条记录,但是如果你想得到第 11 到 20 条数据的时候,又该怎么办呢?答案是:临时表。
-- 取出前 30 条数据到临时表 #TEMP 中
SELECT TOP 30 * INTO
#TEMP
FROM Customers
ORDER BY CompanyName ASC
-- 再从临时表中取出前 10 条数据到另外一个临时表 #TEMP2 中
SELECT TOP 10 *
INTO #TEMP2
FROM #Temp
ORDER BY CompanyName DESC
-- 最后从 #TEMP2 中得到想要的数据
SELECT * FROM #TEMP2
使用这种方法,如果仅仅是想得到前几页内容的时候,还算方便,但是如果用户想要一页一页连续不断得到数据的话,这种方法效率就太低了。
WITH,ROW_NUMBER 和 OVER
这是 SQL Server 2005 中新增的方法。下面的这个例子是返回结果集中的第 20 到 29 条记录。
WITH Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (ORDER BY CompanyName) AS RowNumber
FROM Customers )
SELECT *
FROM Cust
WHERE RowNumber BETWEEN 20 AND 30
SQL Server 2005 中的 WITH 关键字是为结果集指定一个临时名称,类似旧版本 SQL Server 中的临时表的概念。但是,这里最起作用的是 ROW_NUMBER 和 OVER 关键字,它们为每一条记录指定了一个行号。这种方法对于数据量大的表,查询速度非常快,在超过 250000 条记录的表上测试,表现仍然良好。
集成到存储过程中
为了以后使用方便,何不把它们集成到一个存储过程中呢?而且这个存储过程中,要可以灵活的自定义分页大小 @PageSize,和页数 @PageNumber,以便用户可以想看哪页就看哪页。
CREATE PROC GetCustomersByPage
--页大小,第几页
@PageSize INT,
@PageNumber INT
AS
DECLARE @RowStart INT
DECLARE @RowEnd INT
IF @PageNumber > 0
BEGIN
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1
SET @RowEnd = @RowStart + @PageSize - 1
WITH Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (ORDER BY CompanyName) AS RowNumber
FROM Customers )
SELECT *
FROM Cust
WHERE RowNumber >= @RowStart AND RowNumber <= @RowEnd
END
此存储过程有两个参数,@PageSize 和 @PageNumber,使用方法如下:
EXEC GetCustomersByPage 10, 1
自己修改后存储过程
USE [UILogDB]
GO
/****** Object: StoredProcedure [dbo].[Usp_Pagination] Script Date: 11/09/2011 09:22:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <jianxiong>
-- Create date: <2011-10-27>
-- Description: <Pagination>
-- =============================================
CREATE PROCEDURE [dbo].[Usp_Pagination]
-- Add the parameters for the stored procedure here
@table varchar(200), --表名
@field varchar(max), --字段名
@orderby varchar(200), --排序字段
@PageNumber int, --页数
@PageSize int --页面中行数
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
declare @RowStart int
declare @RowEnd int
declare @sql varchar(max)
if @field=''
set @field='*'
if @orderby=''
SELECT top 1 @orderby=syscolumns.name FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id(''+@table+'')
if @PageNumber=''
set @PageNumber='0'
if @PageSize=''
set @PageSize='5'
IF @PageNumber > 0
SET @PageNumber = @PageNumber -1
SET @RowStart = @PageSize * @PageNumber + 1
SET @RowEnd = @RowStart + @PageSize - 1
set @sql=
('
with temptable as
( select row_number() over(order by '+@orderby+') as id,'+@field+' from '+@table+' )
select * from temptable
where id >= '+convert(varchar(15),@RowStart)+' and id<= '+convert(varchar(15),@RowEnd)+'
')
exec (@sql)
END
分享到:
相关推荐
### 标准SQL Server分页存储过程:深入解析与应用 在处理大量数据时,分页技术是提高数据展示效率和用户体验的关键。SQL Server提供的存储过程是实现分页功能的有效方式之一。本文将深入探讨微软C# .NET中的宠物...
很好的通过存储过程实现分页的技术,很好的通过存储过程实现分页的技术,很好的通过存储过程实现分页的技术
#### 一、分页存储过程 GetRecordSet 在 SQL Server 中,实现分页功能是常见的需求之一。下面详细介绍一个常用的分页存储过程 `GetRecordSet`。 **存储过程定义:** ```sql CREATE PROCEDURE [dbo].[GetRecordSet...
### SQL Server 2005 分页显示存储过程 #### 背景介绍 在数据库应用开发中,分页查询是非常常见的需求之一。对于大型数据集来说,如果一次性加载所有数据到前端展示,不仅会增加服务器负担,还会影响用户体验。因此...
本文主要介绍了如何利用Delphi中的dbExpress技术以及Microsoft SQL Server(简称MS_Server)数据库中的存储过程,来提高大数据量环境下的记录查询速度。文章首先概述了dbExpress技术,并提出了一般性的提高查询效率...
近在面试的时候,遇到个奇葩的秃顶老头面试官。 问:写过存储过程分页吗?...只在SQLSERVER2008上测试过,不过我想,2000以上版本应该都会支持的吧。 废话到此,上代码。 if (object_id('Pro
分页存储过程 #### 功能说明 `GetRecordSet`存储过程用于实现SQL Server中的数据分页功能。这在处理大量数据时特别有用,因为它允许用户通过指定的页面大小和页面索引来获取特定页面的数据。 #### 参数解释 - `@...
本文将详细介绍五种不同的分页存储过程方法,并对比它们的性能,帮助数据库管理员和开发人员选择最适合他们需求的方案。 首先,我们创建一个测试数据库`data_Test`和一张名为`tb_TestTable`的表,用于演示这五种...
本文将探讨五种使用存储过程实现SQL Server分页的方法,并进行性能比较。 1. 利用`SELECT TOP` 和 `SELECT NOT IN` 进行分页 这种方法通过首先选择前`pageIndex * pageSize`个记录,然后排除这些记录来获取下一页的...
### 通用分页存储过程与ASPX页面中的调用方法 #### 一、分页存储过程概述 在数据库操作中,分页是非常常见且重要的功能之一。尤其在处理大量数据时,分页能够显著提高用户体验并减少服务器负载。本文介绍了一个...
在SQL Server中,由于不支持MySQL中的`LIMIT`关键字,我们通常使用其他方法来实现分页查询。SQL Server 2008引入了`TOP`和`ROW_NUMBER()`...在实际应用中,可以结合索引优化、存储过程等手段进一步提升分页查询的性能。
本教程全面覆盖了Microsoft SQL Server(简称MS SQL)的各种核心概念和技术,旨在帮助学习者从入门到精通,掌握数据库管理和开发的必备技能。SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程...
以下我们将探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页。 首先,我们需要了解海量数据库的概念。海量数据库是指拥有庞大数量的数据记录的数据库,通常超过100万条记录。这种...
本文主要探讨了在MS SQL Server中遇到的主键设计问题及其解决方案。 首先,传统的主键设计通常基于业务逻辑,例如在销售系统中,销售单号可能是主表的主键,而在从表中则通过引用主表的主键来建立关联。如果业务...
本文总结了 SQL SERVER 数据库中的一些实用 SQL 语句,涵盖了排序、分页、获取当前数据库信息、查询某一个表的字段和数据类型、事务处理、全文匹配查询、计算执行 SQL 语句查询时间等方面。 一、排序 在 SQL ...
- **分页原理**:通过限制查询结果集的数量来实现,通常结合 LIMIT 和 OFFSET 关键字(SQL Server 中为 TOP 和 ROW_NUMBER 函数)。 - 示例: ```sql SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id...
配置文件中定义了数据库连接的相关信息,包括驱动类名(`com.microsoft.sqlserver.jdbc.SQLServerDriver`)、URL(如`jdbc:sqlserver://10.0.1.3:1433;DatabaseName=TEST`)、用户名(`sa`)和密码。 4. **XPage页面...
本文将详细介绍如何在拥有大量数据的 MS SQL Server 数据库中进行查询优化,并探讨高效的大数据分页策略。 #### 二、建立适当的索引 建立“适当”的索引是实现查询优化的关键步骤之一。索引是一种数据结构,它能够...
* 数据库技术:Ms SQL server,用于存储和管理数据。 在本文中,我们还对分页技术的实现进行了详细的分析和讨论,包括了分页技术的优点、缺点,以及在实际应用中的限制和前景等方面的讨论。 本文的主要内容包括: ...