sql server 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持join的,sql server 2000的分页存储过程,也可以运行在sql server 2005上,但是性能没有sql server 2005的版本好。
在最后 我还附带了一个二分法的分页存储过程,也很好用的说哈~~
1.SqlServer 2005:SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE proc [dbo].[up_Page2005] @TableName varchar(50),--表名 @Fields varchar(5000) = "*",--字段名(全部字段为*) @OrderField varchar(5000),--排序字段(必须!支持多字段) @sqlWhere varchar(5000) = Null,--条件语句(不用加where) @pageSize int,--每页多少条记录 @pageIndex int = 1 ,--指定当前为第几页 @TotalPage int output--返回总页数asbeginBegin Tran --开始事务Declare @sql nvarchar(4000);Declare @totalRecord int;--计算总记录数if (@SqlWhere="" or @sqlWhere=NULL)set @sql = "select @totalRecord = count(*) from " + @TableNameelseset @sql = "select @totalRecord = count(*) from " + @TableName + " with(nolock) where " + @sqlWhereEXEC sp_executesql @sql,N"@totalRecord int OUTPUT",@totalRecord OUTPUT--计算总记录数--计算总页数select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)if (@SqlWhere="" or @sqlWhere=NULL)set @sql = "Select * FROM (select ROW_NUMBER() Over(order by " + @OrderField + ") as rowId," + @Fields + " from " + @TableNameelseset @sql = "Select * FROM (select ROW_NUMBER() Over(order by " + @OrderField + ") as rowId," + @Fields + " from " + @TableName + " with(nolock) where " + @SqlWhere--处理页数超出范围情况if @PageIndex<=0Set @pageIndex = 1if @pageIndex>@TotalPageSet @pageIndex = @TotalPage --处理开始点和结束点Declare @StartRecord intDeclare @EndRecord intset @StartRecord = (@pageIndex-1)*@PageSize + 1set @EndRecord = @StartRecord + @pageSize - 1--继续合成sql语句set @Sql = @Sql + ") as t where rowId between " + Convert(varchar(50),@StartRecord) + " and " + Convert(varchar(50),@EndRecord) print @sqlExec(@Sql)---------------------------------------------------If @@Error <> 0 BeginRollBack TranReturn -1 End Else BeginCommit TranReturn @totalRecord ---返回记录总数 Endend
2.Sql Server 2005:/****** 对象: StoredProcedure [dbo].[up_Page2005V2]脚本日期: 05/21/2008 11:27:15 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:<Author,,Name>-- Create date: <Create Date,,>-- Description:<Description,,>-- =============================================CREATE PROCEDURE [dbo].[up_Page2005V2]@TableName varchar(50),--表名 @Fields varchar(5000) = "*",--字段名(全部字段为*) @OrderField varchar(5000),--排序字段(必须!支持多字段) @sqlWhere varchar(5000) = Null,--条件语句(不用加where) @pageSize int,--每页多少条记录 @pageIndex int = 1 ,--指定当前为第几页 @totalRecord int = 0, @TotalPage int output--返回总页数ASBEGIN Begin Tran --开始事务Declare @sql nvarchar(4000);if @totalRecord<=0 begin--计算总记录数if (@SqlWhere="" or @sqlWhere=NULL)set @sql = "select @totalRecord = count(*) from " + @TableNameelseset @sql = "select @totalRecord = count(*) from " + @TableName + " with(nolock) where " + @sqlWhereEXEC sp_executesql @sql,N"@totalRecord int OUTPUT",@totalRecord OUTPUT--计算总记录数end--计算总页数select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)if (@SqlWhere="" or @sqlWhere=NULL)set @sql = "Select * FROM (select ROW_NUMBER() Over(order by " + @OrderField + ") as rowId," + @Fields + " from " + @TableNameelseset @sql = "Select * FROM (select ROW_NUMBER() Over(order by " + @OrderField + ") as rowId," + @Fields + " from " + @TableName + " with(nolock) where " + @SqlWhere--处理页数超出范围情况if @PageIndex<=0Set @pageIndex = 1if @pageIndex>@TotalPageSet @pageIndex = @TotalPage --处理开始点和结束点Declare @StartRecord intDeclare @EndRecord intset @StartRecord = (@pageIndex-1)*@PageSize + 1set @EndRecord = @StartRecord + @pageSize - 1--继续合成sql语句set @Sql = @Sql + ") as t where rowId between " + Convert(varchar(50),@StartRecord) + " and " + Convert(varchar(50),@EndRecord) print @sqlExec(@Sql)---------------------------------------------------If @@Error <> 0 BeginRollBack TranReturn -1 End Else BeginCommit TranReturn @totalRecord ---返回记录总数 EndENDGO
3.Sql Server 2005:/****** 对象: StoredProcedure [dbo].[up_Page2005V2_Join]脚本日期: 05/21/2008 11:27:30 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE [dbo].[up_Page2005V2_Join]@TableName varchar(150),--表名 @Fields varchar(5000) = "*",--字段名(全部字段为*) @OrderField varchar(5000),--排序字段(必须!支持多字段) @sqlWhere varchar(5000) = Null,--条件语句(不用加where) @pageSize int,--每页多少条记录 @pageIndex int = 1 ,--指定当前为第几页 @totalRecord int = 0, @TotalPage int output--返回总页数ASBEGIN Begin Tran --开始事务Declare @sql nvarchar(4000);if @totalRecord<=0 begin--计算总记录数if (@SqlWhere="" or @sqlWhere=NULL)set @sql = "select @totalRecord = count(*) from " + @TableNameelseset @sql = "select @totalRecord = count(*) from " + @TableName + " where " + @sqlWhereEXEC sp_executesql @sql,N"@totalRecord int OUTPUT",@totalRecord OUTPUT--计算总记录数end--计算总页数select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)if (@SqlWhere="" or @sqlWhere=NULL)set @sql = "Select * FROM (select ROW_NUMBER() Over(order by " + @OrderField + ") as rowId," + @Fields + " from " + @TableNameelseset @sql = "Select * FROM (select ROW_NUMBER() Over(order by " + @OrderField + ") as rowId," + @Fields + " from " + @TableName + " where " + @SqlWhere--处理页数超出范围情况if @PageIndex<=0Set @pageIndex = 1if @pageIndex>@TotalPageSet @pageIndex = @TotalPage --处理开始点和结束点Declare @StartRecord intDeclare @EndRecord intset @StartRecord = (@pageIndex-1)*@PageSize + 1set @EndRecord = @StartRecord + @pageSize - 1--继续合成sql语句set @Sql = @Sql + ") as t where rowId between " + Convert(varchar(50),@StartRecord) + " and " + Convert(varchar(50),@EndRecord) print @sqlExec(@Sql)---------------------------------------------------If @@Error <> 0 BeginRollBack TranReturn -1 End Else BeginCommit TranReturn @totalRecord ---返回记录总数 EndEND
4.Sql Server 2000:USE [game]GO/****** 对象: StoredProcedure [dbo].当前1/3页 123下一页