分页存储过程整理-整理
2013-03-17 18:17
381 查看
使用系统存储过程实现的通用分页存储过程
SQL 2005的ROW_NUMBER()实现分页功能
使用内存表
SQL 2005 版本 通用分页存储过程
CREATE PROC sp_PageView @sql ntext, --要执行的sql语句 @PageCurrent int=1, --要显示的页码 @PageSize int=10, --每页的大小 @PageCount int OUTPUT --总页数 AS SET NOCOUNT ON DECLARE @p1 int --初始化分页游标 EXEC sp_cursoropen @cursor=@p1 OUTPUT, @stmt=@sql, @scrollopt=1, @ccopt=1, @rowcount=@PageCount OUTPUT --计算总页数 IF ISNULL(@PageSize,0)<1 SET @PageSize=10 SET @PageCount=(@PageCount+@PageSize-1)/@PageSize IF ISNULL(@PageCurrent,0)<1 OR ISNULL(@PageCurrent,0)>@PageCount SET @PageCurrent=1 ELSE SET @PageCurrent=(@PageCurrent-1)*@PageSize+1 --显示指定页的数据 EXEC sp_cursorfetch @p1,16,@PageCurrent,@PageSize --关闭分页游标 EXEC sp_cursorclose @p1
SQL 2005的ROW_NUMBER()实现分页功能
DECLARE @pagenum AS INT, @pagesize AS INT SET @pagenum = 2 SET @pagesize = 3 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum, newsid, topic, ntime, hits FROM news) AS D WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize ORDER BY newsid DESC
使用内存表
create proc Proc_paged ( @pagesize int, @pagenum int, @pagecount int output ) as begin --声明变量 declare @tmptable table(id int identity (1,1),userid nchar(5)) declare @idBengin int declare @idend int --构造内存表 insert into @tmptable (userid )(select userid from users) select @pagecount=count(*) from @tmptable if(@pagecount%@pagesize>0) set @pagecount=@pagecount/@pagesize+1 else set @pagecount=@pagecount/@pagesize set @idBengin=(@pagenum-1)*@pagesize set @idend=@idBengin+@pagesize select t2.id,t1.* from users t1,@tmptable t2 where t1.userid=t2.userid and t2.id>@idBengin and t2.id<=@idend end
SQL 2005 版本 通用分页存储过程
-- ============================================= -- Author: 黄剑平 -- Create date: 2007-5-11 -- Description: SQL 2005 版本 通用分页存储过程 -- BLOG: http://www.fnsword.com -- ============================================= Create PROCEDURE [dbo].[Pagination] @Page int = 1, -- 当前页码 @PageSize int = 10, -- 每页记录条数(页面大小) @Table nvarchar(500), -- 表名或视图名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab @Field nvarchar(200) = '*', -- 返回记录集字段名,","隔开,默认是"*" @OrderBy nvarchar(100) = 'ID ASC', -- 排序规则 @Filter nvarchar(500), -- 过滤条件 @MaxPage smallint output, -- 执行结果 -1 error, 0 false, maxpage true @TotalRow int output, -- 记录总数 /* 2007-07-12 22:11:00 update */ @Descript varchar(100) output -- 结果描述 AS BEGIN Set ROWCOUNT @PageSize; Set @Descript = 'successful'; -------------------参数检测---------------- IF LEN(RTRIM(LTRIM(@Table))) !> 0 Begin Set @MaxPage = 0; Set @Descript = 'table name is empty'; Return; End IF LEN(RTRIM(LTRIM(@OrderBy))) !> 0 Begin Set @MaxPage = 0; Set @Descript = 'order is empty'; Return; End IF ISNULL(@PageSize,0) <= 0 Begin Set @MaxPage = 0; Set @Descript = 'page size error'; Return; End IF ISNULL(@Page,0) <= 0 Begin Set @MaxPage = 0; Set @Descript = 'page error'; Return; End -------------------检测结束---------------- Begin Try -- 整合SQL Declare @SQL nvarchar(4000), @Portion nvarchar(4000); Set @Portion = ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') AS ROWNUM FROM ' + @Table; Set @Portion = @Portion + (CASE WHEN LEN(@Filter) >= 1 THEN (' Where ' + @Filter + ') AS tab') ELSE (') AS tab') END); Set @SQL = 'Select TOP(' + CAST(@PageSize AS nvarchar(8)) + ') ' + @Field + ' FROM (Select ' + @Field + ',' + @Portion; Set @SQL = @SQL + ' Where tab.ROWNUM > ' + CAST((@Page-1)*@PageSize AS nvarchar(8)); -- 执行SQL, 取当前页记录集 Execute(@SQL); -------------------------------------------------------------------- -- 整合SQL Set @SQL = 'Set @Rows = (Select MAX(ROWNUM) FROM (Select' + @Portion + ')'; -- 执行SQL, 取最大页码 Execute sp_executesql @SQL, N'@Rows int output', @TotalRow output; Set @MaxPage = (CASE WHEN (@TotalRow % @PageSize)<>0 THEN (@TotalRow / @PageSize + 1) ELSE (@TotalRow / @PageSize) END); End Try Begin Catch -- 捕捉错误 Set @MaxPage = -1; Set @Descript = 'error line: ' + CAST(ERROR_LINE() AS varchar(8)) + ', error number: ' + CAST(ERROR_NUMBER() AS varchar(8)) + ', error message: ' + ERROR_MESSAGE(); Return; End Catch; -- 执行成功 Return; END
相关文章推荐
- 整理:分页存储过程整理
- SqlServer 2000、2005分页存储过程整理第1/3页
- 自己整理的一些分页存储过程
- 整理:分页存储过程整理
- 整理:分页存储过程整理
- 项目整理复习一:SQL高效分页存储过程
- 在这里整理了两个可以用的分页存储过程,以备后用。
- 整理:分页存储过程整理
- 整理:分页存储过程整理
- 整理的oracle数据库分页存储过程及示例
- SQL分页存储过程和C#中linq分页查询方法
- SQL2005 存储过程通用分页
- 分页存储过程
- 海量数据存储过程分页
- 分页存储过程- -
- 高效分页存储过程,请配合AspNetPager使用
- mysql查看所有存储过程,函数,视图,触发器,表,分页
- 利用SQL2005的row_number()重新写了个自定义分页存储过程