`

在SQL Server中通过SQL语句实现分页查询

阅读更多

存储过程:

CREATE PROCEDURE PrcTest 
-- 获得某一页的数据 -- 
@currPage int = 1,                                  --当前页页码 (即Top currPage) 
@showColumn varchar(2000) = '*',         --需要得到的字段 (即 column1,column2,......) 
@tabName varchar(2000),                     --需要查看的表名 (即 from table_name) 
@strCondition varchar(2000) = '',            --查询条件 (即 where condition......) 不用加where关键字 
@ascColumn varchar(100) = '',               --排序的字段名 (即 order by column asc/desc) 
@bitOrderType bit = 0,                           ---排序的类型 (0为升序,1为降序) 
@pkColumn varchar(50) = '',                  --主键名称 
@pageSize int = 20                                --分页大小 

AS 
BEGIN -- 存储过程开始 
-- 该存储过程需要用到的几个变量 
DECLARE @strTemp varchar(1000) 
DECLARE @strSql varchar(4000)            --该存储过程最后执行的语句 
DECLARE @strOrderType varchar(1000)      --排序类型语句 (order by column asc或者order by column desc) 

BEGIN 
IF @bitOrderType = 1    -- bitOrderType=1即执行降序 
BEGIN 
     SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC' 
     SET @strTemp = '<(SELECT min' 
END 
ELSE 
BEGIN 
     SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC' 
     SET @strTemp = '>(SELECT max' 
END 

IF @currPage = 1     -- 如果是第一页 
BEGIN 
     IF @strCondition != '' 
         SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+ 
             ' WHERE '+@strCondition+@strOrderType 
     ELSE 
         SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType 
END 

ELSE     -- 其他页 
BEGIN 
     IF @strCondition !='' 
         SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+ 
         ' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+ 
         ' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType 
     ELSE 
         SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+ 
         ' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+ 
         ' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType 
END 

END 
EXEC (@strSql) 
END   -- 存储过程结束 

--prcPageResult 1,'*','TableName','','CreateDate',1,'PkID',25 
/* 
下面的存储过程查询表的记录数 
CREATE PROC prcRowsCount 
@tabName varchar(200),             --需要查询的表名 
@colName varchar(200)='*',         --需要查询的列名 
@condition varchar(200)=''        --查询条件 
AS 
BEGIN 
     DECLARE @strSql varchar(255) 
     IF @condition = '' 
         SET @strSql='select count('+@colName+') from '+@tabName 
     ELSE 
         SET @strSql='select count('+@colName+') from '+@tabName+' where '+@condition 
     EXEC (@strSql) 
END 
*/ 
GO

 

 

建立表:

 

CREATE TABLE [TestTable] ( 
[ID] [int] IDENTITY (1, 1) NOT NULL , 
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , 
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , 
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY] 
GO

 

 

插入数据:(2万条,用更多的数据测试会明显一些)

SET IDENTITY_INSERT TestTable ON

declare @i int 
set @i=1 
while @i<=20000 
begin 
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, ''FirstName_XXX'',''LastName_XXX'',''Country_XXX'',''Note_XXX'') 
set @i=@i+1 
end

SET IDENTITY_INSERT TestTable OFF

 

 

分页方案一:(利用Not In和SELECT TOP分页)
语句形式:

 

SELECT TOP 10 * 
FROM TestTable 
WHERE (ID NOT IN 
(SELECT TOP 20 id 
FROM TestTable 
ORDER BY id)) 
ORDER BY ID


SELECT TOP 页大小 * 
FROM TestTable 
WHERE (ID NOT IN 
(SELECT TOP 页大小*页数 id 
FROM 表 
ORDER BY id)) 
ORDER BY ID

 

分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:

 

SELECT TOP 10 * 
FROM TestTable 
WHERE (ID > 
(SELECT MAX(id) 
FROM (SELECT TOP 20 id 
FROM TestTable 
ORDER BY id) AS T)) 
ORDER BY ID


SELECT TOP 页大小 * 
FROM TestTable 
WHERE (ID > 
(SELECT MAX(id) 
FROM (SELECT TOP 页大小*页数 id 
FROM 表 
ORDER BY id) AS T)) 
ORDER BY ID

 

分页方案三:(利用SQL的游标存储过程分页)

 

create procedure XiaoZhengGe 
@sqlstr nvarchar(4000), --查询字符串 
@currentpage int, --第N页 
@pagesize int --每页行数 
as 
set nocount on 
declare @P1 int, --P1是游标的id 
@rowcount int 
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output 
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 
set @currentpage=(@currentpage-1)*@pagesize+1 
exec sp_cursorfetch @P1,16,@currentpage,@pagesize 
exec sp_cursorclose @P1 
set nocount off 

 

 

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

 

 

 

分享到:
评论

相关推荐

    sqlserver分页查询语句

    sqlserver分页查询语句;sqlserver分页查询语句;sqlserver分页查询语句;

    关于SQL Server SQL语句查询分页数据的解决方案

    针对这一需求,本文将详细介绍如何在SQL Server中实现有效的分页查询。 ### 方法1:使用NOT IN 这种方法通过先选择前300100条记录的序列号(这里假设`fldserialNo`是唯一标识每一行的字段),然后在外层查询中排除...

    SqlServer数据库中的分页语句

    在SQL Server中,通常使用`TOP`关键字结合子查询来实现分页。 一个典型的分页查询语句结构如下: ```sql SELECT * FROM ( SELECT TOP pagesize * FROM ( SELECT TOP pagesize*cureentpage * FROM user_...

    sqlserver+group by分组查询分页存储过程

    3. **执行分页查询**:使用动态生成的SQL语句执行查询,并通过设置`ROWCOUNT`来限制返回的结果集大小。 ### 综合运用`GROUP BY`、存储过程和分页技术 在给定的存储过程中,`GROUP BY`子句与分页查询的结合使用提供...

    java 连接sqlserver数据库查询,并分页显示

    在Java编程中,连接SQL Server数据库并执行查询是常见的任务,尤其当涉及到大量数据时,分页显示就显得尤为重要。本篇文章将详细讲解如何使用Java连接SQL Server数据库,执行查询语句以及实现分页显示。 首先,我们...

    java语言的分页查询功能(mysql和sql server)

    在Java编程中,分页查询是一项非常重要的功能,特别是在处理大量数据时,它能有效地减少内存负担,提高应用性能。...无论是在MySQL还是SQL Server中,正确地实现分页都能显著提升应用性能和用户体验。

    sql server 2008通用分页

    SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。

    sqlserver 实现分页的前台代码 以及后台的sqlserver语句

    在SQL Server中,实现分页查询是数据库应用中常见的需求,尤其在大数据量的展示时,分页可以提高用户体验并优化服务器性能。本教程将详细讲解如何在前端使用Java(假设Test.jsp为JSP页面)和后端使用SQL Server语句...

    sql分页 sqlserver中存储过程分页

    通过上述分析可以看出,这个存储过程通过动态生成 SQL 语句的方式实现了较为灵活且高效的分页查询。这种实现方式不仅适用于 SQL Server,也可以为其他关系型数据库设计分页查询提供一定的参考价值。对于实际项目开发...

    用SQL语句实现分页(Oracle版Sql Server版)

    无论是Oracle还是SQL Server,在实现分页查询时都有一些特定的技巧和方法。尽管两者在具体实现细节上有差异,但核心思想是相同的:通过限制查询结果集的范围来实现分页功能。这些技术对于提高Web应用程序的性能至关...

    数据库分页SQL语句实现

    本文将详细介绍三种主流数据库(SQL Server、MySQL和Oracle)中的分页SQL语句实现方法。 #### SQL Server 的分页SQL语句实现 SQL Server 支持通过`TOP`关键字来实现分页查询。具体实现方式如下: 1. **查询第M页...

    SQL Server2005分页查询

    在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...

    sql server 分页大全

    总结,SQL Server 2000虽然没有内置的分页机制,但通过存储过程和TSQL语句的组合,依然可以实现高效的分页查询。理解并熟练运用这些技术,能帮助我们更好地管理和展示大量的数据库数据。在实际应用中,应根据具体...

    通用的存储过程sql分页查询语句

    存储过程是一组预先编译好的SQL语句,存储在数据库服务器中,可以按需调用执行。它的优点包括提高性能、减少网络流量、增强安全性以及简化复杂的操作。在分页查询场景下,创建一个存储过程可以有效地封装分页逻辑,...

    最简单的SQL Server数据库存储过程分页

    在SQL Server中,通过存储过程实现分页是一种常见且高效的解决方案。其核心思想是利用游标(Cursor)或临时表来获取数据总量,并根据指定的页码和每页数量来计算出需要返回的具体记录范围。这种方法的优势在于它可以...

    SQLServer数据库分页查询

    本文主要探讨在 SQL Server 2008 R2 版本中实现分页查询的五种不同方法,并对这些方法进行了性能测试。 #### 二、测试环境与条件 - **数据库**: SQL Server 2008 R2 - **表名**: ARTICLE - **字段**: ID (主键,...

    SSH框架+SQLServer实现分页的小项目

    分页查询通常需要编写SQL语句,利用`TOP`(在SQLServer中)或其他类似关键字来限制返回的记录数,配合`ORDER BY`进行排序。 **分页实现** 在SSH框架下实现分页,通常会涉及到以下几个步骤: 1. **前端页面**:...

Global site tag (gtag.js) - Google Analytics