百万级分页存储过程该进版

9/1/2015来源:SQL技巧人气:1418

百万级分页存储过程该进版

--经过一段时间的使用,这个存储过程发现了一些不完美的地方,主要体现在排序的问题上面,一般排序都应该是把最新的显示在前面的,修改前的只能指定一个字段进行排序,而且还需要指定是按降序还是升序来排,而且使用的时候排序只在当前也排序,而不是针对所有记录来排序,现修改后版本如下:可以指定多个字段排序,并且是针对所有满足条件的记录进行排序。

SET ANSI_NULLS ONGO

SET QUOTED_IDENTIFIER ONGO

-- Batch submitted through debugger: SQLQuery8.sql|0|0|C:\Users\Administrator\AppData\Local\Temp\~vsBEFB.sql/****** Object: StoredPRocedure [dbo].[Proc_PageData] Script Date: 03/12/2012 16:38:59 ******/

CREATE PROCEDURE [dbo].[Proc_PageData](@tblName nvarchar(200), ----要显示的表或多个表的连接@fldName nvarchar(2000) = '*', ----要显示的字段列表@pageSize int = 100, ----每页显示的记录个数@page int = 1, ----要显示那一页的记录@pageCount int = 1 output, ----查询结果分页后的总页数@Counts int = 1 output, ----查询到的记录数@ID nvarchar(50), ----主表的主键@fldSort nvarchar(1000) ='', ----排序字段列表或条件@Sort bit = 0, ----排序方法,0为升序,1为降序@strCondition nvarchar(2000) ='' ----查询条件,不需where)ASSET NOCOUNT ONDeclare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句Declare @sqlSort nvarchar(200) ----存放临时生成的排序条件Declare @intCounts int ----要移动的记录数Declare @BeginID int ----开始的IDDeclare @EndID int ----结束的IDdeclare @tempID intdeclare @topstr nvarchar(1000)declare @conditionStr nvarchar(1000)--------首先生成排序方法-----------if @Sort=0 --升序--beginif @fldSort <>''set @sqlSort = ' Order by ' + @fldSort elseset @sqlSort = ' Order by ' + @ID +' DESC'--end--else --降序--begin--if @fldSort='' -- set @sqlSort = ' Order by ' + @ID + ' DESC '--else -- set @sqlSort = ' Order by ' + @fldSort --end--------生成查询语句----------此处@strTmp为取得查询结果数量的语句if @strCondition='' --没有设置显示条件beginset @sqlTmp = @fldName + ' From ' + @tblNameset @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblNameset @strID = ' From ' + @tblName+ ' '+@sqlSortendelsebeginset @sqlTmp = + @fldName + 'From ' + @tblName set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName + ' where ' + @strConditionset @strID = ' From ' + @tblName + ' where ' + @strCondition + ' '+@sqlSortend--print @strID----取得查询结果总数量-----exec sp_executesql @strTmp,N'@Counts int out ',@Counts out--取得分页总数if @Counts <= @pageSizeset @pageCount = 1elsebeginif @Counts%@PageSize=0 set @pageCount = (@Counts / @pageSize) elseset @pageCount = (@Counts / @pageSize) + 1endset @topstr=' top '+Convert(nvarchar,@pageSize)--计算要移动的记录数if @page = 1 --加快处理begin-----取得分页后此页的第一条记录的IDset @conditionStr=''end elsebegin-----取得分页后此页的第一条记录的IDif @pageCount>1begindeclare @topnum intset @topnum=(@page-1)*@PageSizeset @conditionStr=' '+@ID+' not in(select top '+ Convert(nvarchar,@topnum)+' '+@ID+' from '+@tblName+@sqlSort+')'endelseset @conditionStr=''end --print @strIDif @BeginID>@EndIDbegin set @tempID=@BeginID set @BeginID=@EndID set @EndID=@tempIDend------恢复系统设置-----set rowcount 0SET NOCOUNT ON------返回查询结果-----if @strCondition=''begin if @conditionStr='' set @strTmp = 'select ' + @topstr + ' ' + @sqlTmp else set @strTmp = 'select ' + @topstr + ' ' + @sqlTmp + ' where ' + @conditionStrendelsebeginif @conditionStr=''set @strTmp = 'select ' + @topstr + ' ' + @sqlTmp + ' where ' + @strConditionelseset @strTmp = 'select ' + @topstr + ' ' + @sqlTmp + ' where ' + @strCondition +' and '+@conditionStrend--if @conditionStr<>''--set @strTmp=@strTmp+@conditionStrif @sqlSort<>''set @strTmp = @strTmp+@sqlSort--print @strTmp--print @topstrexec sp_executesql @strTmp