真正通用的SQL分页存储过程

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

 1 CREATE PROCEDURE [dbo].[SP_PageResult]
 2 -- 获得某一页的数据 --
 3 @currPage int = 1, --当前页页码 (即Top currPage)
 4 @showColumn varchar(2000) = ‘*‘, --需要得到的字段 (即 column1,column2,......)
 5 @tabName varchar(2000), --需要查看的表名 (即 from table_name)
 6 @strCondition varchar(2000) = ‘‘, --查询条件 (即 where condition......) 不用加where关键字
 7 @ascColumn varchar(100) = ‘‘, --排序的字段名 (即 order by column asc/desc)
 8 @bitOrderType bit = 0, --排序的类型 (1为降序,其它为升序)
 9 @pageSize int = 20 --分页大小
10 --
11 AS
12 BEGIN -- 存储过程开始
13 -- 该存储过程需要用到的几个变量 --
14 DECLARE @strTemp varchar(1000)
15 DECLARE @strSql varchar(4000) --该存储过程最后执行的语句
16 DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)
17 DECLARE @RIDorder varchar(100)
18 BEGIN
19 IF @bitOrderType = 1 -- bitOrderType=1即执行降序
20  BEGIN
21  SET @strOrderType = ‘ ORDER BY ‘+@ascColumn+‘ DESC‘
22  SET @strTemp = ‘<(SELECT min‘
23  SET @RIDorder  = ‘ ORDER BY RID DESC‘
24  END
25 ELSE
26  BEGIN
27  SET @strOrderType = ‘ ORDER BY ‘+@ascColumn+‘ ASC‘
28  SET @strTemp = ‘>(SELECT max‘
29  SET @RIDorder  = ‘ ORDER BY RID ASC‘
30  END
31
32
33 IF @currPage = 1 -- 如果是第一页
34 BEGIN
35 IF @strCondition != ‘‘
36  BEGIN
37   SET @strSql = ‘SELECT  row_number() over (‘ + @strOrderType +‘) AS RID,‘+@showColumn+‘ INTO #T FROM ‘+@tabName+ ‘ WHERE ‘+@strCondition+‘ ‘+@strOrderType +‘; create index I1 on #T(RID);‘
38   SET @strSql = @strSql + ‘ SELECT TOP ‘+STR(@pageSize)+@showColumn+‘ FROM #T ‘ + @RIDorder
39
40  END
41 ELSE
42  BEGIN
43   SET @strSql = ‘SELECT  row_number() over (‘ + @strOrderType +‘) AS RID,‘+@showColumn+‘ INTO #T FROM ‘+@tabName+ ‘ ‘+@strOrderType +‘; create index I1 on #T(RID);‘
44   SET @strSql = @strSql + ‘ SELECT TOP ‘+STR(@pageSize)+@showColumn+‘ FROM #T ‘ + @RIDorder
45
46  END
47 END
48
49 ELSE -- 其他页
50 BEGIN
51
52 IF @strCondition !=‘‘
53  BEGIN
54   SET @strSql = ‘SELECT  row_number() over (‘ + @strOrderType +‘) AS RID,‘+@showColumn+‘ INTO #T FROM ‘+@tabName+ ‘ WHERE ‘+@strCondition+‘ ‘+@strOrderType +‘; create index I1 on #T(RID);‘
55   SET @strSql = @strSql + ‘SELECT TOP ‘+STR(@pageSize)+‘ ‘+@showColumn+‘ FROM ‘+‘#T‘+
56   ‘ WHERE ‘+@strCondition+‘ AND ‘+‘RID‘+@strTemp+‘(‘+‘RID‘+‘)‘+‘ FROM (SELECT TOP ‘+STR((@currPage-1)*@pageSize)+
57   ‘ ‘+‘RID‘+‘ FROM ‘+‘#T‘+@RIDorder+‘) AS TabTemp)‘+@RIDorder
58  END
59 ELSE
60  BEGIN
61   SET @strSql = ‘SELECT  row_number() over (‘ + @strOrderType +‘) AS RID,‘+@showColumn+‘ INTO #T FROM ‘+@tabName+‘ ‘ + @strOrderType  +‘; create index I1 on #T(RID);‘
62   SET @strSql = @strSql + ‘SELECT TOP ‘+STR(@pageSize)+‘ ‘+@showColumn+‘ FROM ‘+‘#T‘+
63   ‘ WHERE ‘+‘RID‘+@strTemp+‘(‘+‘RID‘+‘)‘+‘ FROM (SELECT TOP ‘+STR((@currPage-1)*@pageSize)+‘ ‘+‘RID‘+
64   ‘ FROM ‘+‘#T‘+@RIDorder+‘) AS TabTemp)‘+@RIDorder
65  END
66 END
67
68 END
69
70 set  @strSql=@strSql+‘;select count(*) from ‘+ ‘#T‘ + ‘;DROP TABLE #T‘
71 print @strSql
72 exec (@strSql)
73
74 END -- 存储过程结束 

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

真正通用的SQL分页存储过程,布布扣,bubuko.com

时间: 2024-10-13 10:25:29

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

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

[转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合

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

http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************************************* * 作 用:数据分页(完整SQL分页存储过程(支持多表联接))* 作 者:齐李平* 创建日期:2009-03-23* 使用说明: 1.单表调用方法:EXEC proc_DataPagination @tblName = 'ipa',@fldName

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

建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存 中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的 不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长

SQL 分页存储过程 以及SQL concatenate 几种方法

1 USE [GPP] 2 GO 3 /****** Object: StoredProcedure [dbo].[P_V_USER_INFO_ROLE_SCHEME_S_PAGE_BY_APPID_ROLEID] Script Date: 14/11/2014 10:10:36 AM ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 ALTER PROC [dbo].[P_V_USER_INFO_ROLE_SC

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

创建存储过程: CREATE PROCEDURE [dbo].[sp_TBTest_Query] ( @PageSize INT, --每页多少条记录 @PageIndex INT = 1, --指定当前为第几页 @PageCount INT OUTPUT, --返回总页数 @RecordCount INT OUTPUT, --记录总和 @OrderField VARCHAR(5000), --排序字段(多字段,不含Order By) @strWhere VARCHAR(5000), --条件语

MS SQL 分页存储过程

最近换了家新公司,但是新公司没有使用分页的存储过程.哎~~,硬着头皮自己尝试写了一个,别说还挺好用的.(效率怎么样就不怎么清除没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pageList] ( @tab NVARCHAR(MAX) ,---表名 @PrimaryKey VARCHAR(100) , --主键ID @strFld NVARCHAR(MAX) , --字段字符串 @strWhere NVARCHAR(MAX) = ' ' , --wher

Sql分页存储过程及调用

Alter Proc P_Page( @TblName varchar(200), --表名 @PageSize int, --每页显示条数 @PageIndex int = 1, --页面索引(页码) @strGetFields varchar(1000)='*', --无传入值,则搜索所有列 @OrderType int = 0, --是否倒序(0=否,1=是) @FldName varchar(100), --以什么条件进行倒叙 @StrWhere varchar(2000), --查询条

sql分页存储过程

USE [DBName]GO/****** Object: StoredProcedure [dbo].[UP_GetRecordByPage] Script Date: 12/05/2012 16:17:11 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO ALTER PROCEDURE [dbo].[UP_GetRecordByPage] @tblName varchar(255), -- 表名 @fldName varchar(25

sql 分页存储过程

ALTER procedure [dbo].[fenye]@pagesize int, --每页显示数量@pageCurrent int, --当前页@tablename varchar(20), --表名@field varchar(20), --显示的列名(eg: id,name)@where varchar(20), --筛选条件 (eg: name not null)@orderBy varchar(20), --排序的列名(eg: id 或者 id desc)@count int ou