关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的。但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用。这里还增加了索引,以方便大数据量的使用(代码中是先抓到临时表的,从性能上说如果采用自增长式的ID表,当然可以不使用临时表以达到性能的提升)。以下代码的SP是经过我们项目使用通过的。因朋友问及此问题,我就放在这里供大家分享,如各位大侠有更好的方法,也请告诉我。在这里先感谢各位了。

ALTER PROCEDURE [dbo].[SP_PageResult2]
-- 获得某一页的数据 --
@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 --分页大小
-- SP_PageResult2 '1','*','Bom','1=1','Ancestor',0,30
AS
BEGIN -- 存储过程开始
-- 该存储过程需要用到的几个变量 --
DECLARE @strTemp varchar(1000)
DECLARE @strSql varchar(4000) --该存储过程最后执行的语句
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)
DECLARE @RIDorder varchar(100)
BEGIN
IF @bitOrderType = 1 -- bitOrderType=1即执行降序
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'
SET @strTemp = '>(SELECT max' -- 因为降降得升,所以这里依然是>(SELECT max ,而不是<(SELECT min
SET @RIDorder = ' ORDER BY RID ASC' -- 因为降降得升。所以这里依然是asc
END
ELSE
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'
SET @strTemp = '>(SELECT max'
SET @RIDorder = ' ORDER BY RID ASC'
END IF @currPage = 1 -- 如果是第一页
BEGIN
IF @strCondition != ''
BEGIN
SET @strSql = 'SELECT row_number() over (' + @strOrderType +') AS RID,'+@showColumn+' INTO #T FROM '+@tabName+ ' WHERE '+@strCondition+' '+@strOrderType +'; create index I1 on #T(RID);'
SET @strSql = @strSql + ' SELECT TOP '+STR(@pageSize)+@showColumn+' FROM #T ' + @RIDorder END
ELSE
BEGIN
SET @strSql = 'SELECT row_number() over (' + @strOrderType +') AS RID,'+@showColumn+' INTO #T FROM '+@tabName+ ' '+@strOrderType +'; create index I1 on #T(RID);'
SET @strSql = @strSql + ' SELECT TOP '+STR(@pageSize)+@showColumn+' FROM #T ' + @RIDorder END
END ELSE -- 其他页
BEGIN IF @strCondition !=''
BEGIN
SET @strSql = 'SELECT row_number() over (' + @strOrderType +') AS RID,'+@showColumn+' INTO #T FROM '+@tabName+ ' WHERE '+@strCondition+' '+@strOrderType +'; create index I1 on #T(RID);'
SET @strSql = @strSql + 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+'#T'+
' WHERE '+@strCondition+' AND '+'RID'+@strTemp+'('+'RID'+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+
' '+'RID'+' FROM '+'#T'+@RIDorder+') AS TabTemp)'+@RIDorder
END
ELSE
BEGIN
SET @strSql = 'SELECT row_number() over (' + @strOrderType +') AS RID,'+@showColumn+' INTO #T FROM '+@tabName+' ' + @strOrderType +'; create index I1 on #T(RID);'
SET @strSql = @strSql + 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+'#T'+
' WHERE '+'RID'+@strTemp+'('+'RID'+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+'RID'+
' FROM '+'#T'+@RIDorder+') AS TabTemp)'+@RIDorder
END
END END
--IF @strCondition != ''
-- set @strSql=@strSql+';select count(*) from '+ @tabName +' where '+ @strCondition +';DROP TABLE #T'
--else
set @strSql=@strSql+';select count(*) from '+ '#T' + ';DROP TABLE #T'
print @strSql
exec (@strSql) END -- 存储过程结束

下图为调用结果,从结果来看。正确的。

真正通用的SQL分页存储过程的更多相关文章

  1. [转]关于SQL分页存储过程的分析

    [转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...

  2. Delphi调用SQL分页存储过程实例

    Delphi调用SQL分页存储过程实例 (-- ::)转载▼ 标签: it 分类: Delphi相关 //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 //----分页存 ...

  3. 完整SQL分页存储过程(支持多表联接)

    http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************* ...

  4. 关于SQL分页存储过程的分析

    建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅 ...

  5. SQL - 分页存储过程

    http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...

  6. 修改后的SQL分页存储过程,利用2分法,支持排序

    /****** Object: StoredProcedure [dbo].[sys_Page_v3] Script Date: 08/13/2014 09:32:28 ******/ SET ANS ...

  7. sql分页存储过程比较

    一,先创建一百万条数据 drop table #tmp create table #tmp ( id ,) primary key, name ) ) declare @i int begin ins ...

  8. MS SQL 分页存储过程

    最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...

  9. sql分页存储过程,带求和、排序

    创建存储过程: CREATE PROCEDURE [dbo].[sp_TBTest_Query] ( @PageSize INT, --每页多少条记录 @PageIndex INT = 1, --指定 ...

随机推荐

  1. jad安装

    见:http://www.myexception.cn/eclipse/1469829.html 最开始看了一个坑爹的博客,由于是低级菜鸟一直被误导(设置的是.class的打开方式) 执行完链接够的步 ...

  2. windows xp 安装mysql5.6.17-ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password

    .zip解压后没有setup 没有my.ini 1.安装方法 bin目录下执行以下: E:\mysql-5.6.17-win32\bin>mysqld install MySQL --defau ...

  3. 使用svcutil.exe 生成服务的代码

    @echo offcall "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"svcuti ...

  4. JS面向对象组件(三)--面向对象中的常用属性和方法

    图片的由来看下面: 1.hasOwnProperty:看是不是对象自身下面的属性 var arr = []; arr.num = ; Array.prototype.num2 = ; //所有的数组对 ...

  5. 嵌入式 hi3518平台uboot引导nfs文件系统

    首先贴出来我的bootargs的设置(注没有换行符!!!): setenv bootargs noinitrd mem=64M root=/dev/nfs init=/linuxrc rw nfsro ...

  6. 阻塞、非阻塞的概念和select函数的阻塞功能

    其它文档: http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html (1)阻塞block     所谓阻塞方式block,顾名思义 ...

  7. HDU5828 Rikka with Sequence 线段树

    分析:这个题和bc round 73应该是差不多的题,当时是zimpha巨出的,那个是取phi,这个是开根 吐槽:赛场上写的时候直接维护数值相同的区间,然后1A,结果赛后糖教一组数据给hack了,仰慕 ...

  8. 成功BOSS的六大秘诀

    1.信念力 一个没有坚定信念的人,是不可能成为伟大企业家的.如果你认为自己行,你就一定行:如果你都认为自己不行了,那你就注定不行.在成功这条道路上,要勇敢地自我肯定和鼓励,这样才能带来巨大的创造力并最 ...

  9. saltstack配置安装的一些关键步骤及安装时各种报错的分析

    以下其他仅做参考,官方网址才是安装重点:http://docs.saltstack.cn/topics/installation/rhel.html 与安装相关的一些文档或资料: 一.linux服务器 ...

  10. vector容器使用总结 .xml

    pre{ line-height:1; color:#38ede1; background-color:#5b2814; font-size:16px;}.sysFunc{color:#008080; ...