SqlServer 2000、2005分頁(yè)存儲(chǔ)過(guò)程整理
二分分頁(yè)過(guò)程:
--/*-----存儲(chǔ)過(guò)程 分頁(yè)處理 孫偉 2005-03-28創(chuàng)建 -------*/--/*-----存儲(chǔ)過(guò)程 分頁(yè)處理 浪塵 2008-9-1修改----------*/--/*----- 對(duì)數(shù)據(jù)進(jìn)行了2分處理使查詢前半部分?jǐn)?shù)據(jù)與查詢后半部分?jǐn)?shù)據(jù)性能相同 -------*/alter PROCEDURE proc_paged_2part_selectMax(@tblName nvarchar(200), ----要顯示的表或多個(gè)表的連接@fldName nvarchar(500) = '*', ----要顯示的字段列表@pageSize int = 10, ----每頁(yè)顯示的記錄個(gè)數(shù)@page int = 1, ----要顯示那一頁(yè)的記錄@fldSort nvarchar(200) = null, ----排序字段列表或條件@Sort bit = 0, ----排序方法,0為升序,1為降序(如果是多字段排列Sort指代最后一個(gè)排序字段的排列順序(最后一個(gè)排序字段不加排序標(biāo)記)--程序傳參如:' SortA Asc,SortB Desc,SortC ')@strCondition nvarchar(1000) = null, ----查詢條件,不需where@ID nvarchar(150), ----主表的主鍵@Dist bit = 0, ----是否添加查詢字段的 DISTINCT 默認(rèn)0不添加/1添加@pageCount int = 1 output, ----查詢結(jié)果分頁(yè)后的總頁(yè)數(shù)@Counts int = 1 output ----查詢到的記錄數(shù))ASSET NOCOUNT ONDeclare @sqlTmp nvarchar(1000) ----存放動(dòng)態(tài)生成的SQL語(yǔ)句Declare @strTmp nvarchar(1000) ----存放取得查詢結(jié)果總數(shù)的查詢語(yǔ)句Declare @strID nvarchar(1000) ----存放取得查詢開(kāi)頭或結(jié)尾ID的查詢語(yǔ)句Declare @strSortType nvarchar(10) ----數(shù)據(jù)排序規(guī)則ADeclare @strFSortType nvarchar(10) ----數(shù)據(jù)排序規(guī)則BDeclare @SqlSelect nvarchar(50) ----對(duì)含有DISTINCT的查詢進(jìn)行SQL構(gòu)造Declare @SqlCounts nvarchar(50) ----對(duì)含有DISTINCT的總數(shù)查詢進(jìn)行SQL構(gòu)造declare @timediff datetime --耗時(shí)測(cè)試時(shí)間差select @timediff=getdate()if @Dist = 0begin set @SqlSelect = 'select ' set @SqlCounts = 'Count(*)'endelsebegin set @SqlSelect = 'select distinct ' set @SqlCounts = 'Count(DISTINCT '+@ID+')'endif @Sort=0begin set @strFSortType=' ASC ' set @strSortType=' DESC 'endelsebegin set @strFSortType=' DESC ' set @strSortType=' ASC 'end--------生成查詢語(yǔ)句----------此處@strTmp為取得查詢結(jié)果數(shù)量的語(yǔ)句if @strCondition is null or @strCondition='' --沒(méi)有設(shè)置顯示條件begin set @sqlTmp = @fldName + ' From ' + @tblName set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName set @strID = ' From ' + @tblNameendelsebegin set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition set @strID = ' From ' + @tblName + ' where (1>0) ' + @strConditionend----取得查詢結(jié)果總數(shù)量-----exec sp_executesql @strTmp,N'@Counts int out ',@Counts outdeclare @tmpCounts intif @Counts = 0 set @tmpCounts = 1else set @tmpCounts = @Counts --取得分頁(yè)總數(shù) set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize /**//**//**//**當(dāng)前頁(yè)大于總頁(yè)數(shù) 取最后一頁(yè)**/ if @page>@pageCount set @page=@pageCount --/*-----數(shù)據(jù)分頁(yè)2分處理-------*/ declare @pageIndex int --總數(shù)/頁(yè)大小 declare @lastcount int --總數(shù)%頁(yè)大小 set @pageIndex = @tmpCounts/@pageSize set @lastcount = @tmpCounts%@pageSize if @lastcount > 0 set @pageIndex = @pageIndex + 1 else set @lastcount = @pagesize --//***顯示分頁(yè) if @strCondition is null or @strCondition='' --沒(méi)有設(shè)置顯示條件 begin if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分?jǐn)?shù)據(jù)處理 begin if @page=1 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' order by '+ @fldSort +' '+ @strFSortType else begin if @Sort=1 begin set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' +' order by '+ @fldSort +' '+ @strFSortType end else begin set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' +' order by '+ @fldSort +' '+ @strFSortType end end end else begin set @page = @pageIndex-@page+1 --后半部分?jǐn)?shù)據(jù)處理 if @page <= 1 --最后一頁(yè)數(shù)據(jù)顯示 set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType else if @Sort=1 begin set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType end else begin set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType end end end else --有查詢條件 begin if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分?jǐn)?shù)據(jù)處理 begin if @page=1 set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where 1=1 ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType else if(@Sort=1) begin set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' <(select min('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType end else begin set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' >(select max('+ @ID +') from ('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName +' where (1=1) ' + @strCondition +' order by '+ @fldSort +' '+ @strFSortType+') AS TBMinID)' +' '+ @strCondition +' order by '+ @fldSort +' '+ @strFSortType end end else begin set @page = @pageIndex-@page+1 --后半部分?jǐn)?shù)據(jù)處理 if @page <= 1 --最后一頁(yè)數(shù)據(jù)顯示 set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType else if(@Sort=1) set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' >(select max('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType else set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName +' where '+@ID+' <(select min('+ @ID +') from('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName +' where (1=1) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TBMaxID)' +' '+ @strCondition+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType end end------返回查詢結(jié)果-----exec sp_executesql @strTmpselect datediff(ms,@timediff,getdate()) as 耗時(shí)--print @strTmpSET NOCOUNT OFFGO
- SQL?Server的存儲(chǔ)過(guò)程詳解
- 使用SQL SERVER存儲(chǔ)過(guò)程實(shí)現(xiàn)歷史數(shù)據(jù)遷移方式
- SQL Server存儲(chǔ)過(guò)程在C#中調(diào)用的簡(jiǎn)單實(shí)現(xiàn)方法
- SQLServer2008存儲(chǔ)過(guò)程實(shí)現(xiàn)數(shù)據(jù)插入與更新
- SQLServer存儲(chǔ)過(guò)程創(chuàng)建和修改的實(shí)現(xiàn)代碼
- SQLServer存儲(chǔ)過(guò)程實(shí)現(xiàn)單條件分頁(yè)
- SQL SERVER調(diào)用存儲(chǔ)過(guò)程小結(jié)
- 深入分析SQL Server 存儲(chǔ)過(guò)程
- SQL Server數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程介紹
- SQL Server 2008 存儲(chǔ)過(guò)程示例
- 如何在SQL Server 2008下輕松調(diào)試T-SQL語(yǔ)句和存儲(chǔ)過(guò)程
- SQL?SERVER存儲(chǔ)過(guò)程用法詳解