百萬級分頁儲存過程該進版

2022-04-09 08:57:45 字數 3994 閱讀 4374

--經過一段時間的使用,這個儲存過程發現了一些不完美的地方,主要體現在排序的問題上面,一般排序都應該是把最新的顯示在前面的,修改前的只能指定乙個字段進行排序,而且還需要指定是按降序還是公升序來排,而且使用的時候排序只在當前也排序,而不是針對所有記錄來排序,現修改後版本如下:可以指定多個字段排序,並且是針對所有滿足條件的記錄進行排序。

set ansi_nulls on

goset quoted_identifier on

gocreate 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)as

set nocount on

declare @sqltmp nvarchar(1000) ----存放動態生成的sql語句

declare @strtmp nvarchar(1000) ----存放取得查詢結果總數的查詢語句

declare @strid nvarchar(1000) ----存放取得查詢開頭或結尾id的查詢語句

declare @sqlsort nvarchar(200) ----存放臨時生成的排序條件

declare @intcounts int ----要移動的記錄數

declare @beginid int ----開始的id

declare @endid int ----結束的id

declare @tempid int

declare @topstr nvarchar(1000)

declare @conditionstr nvarchar(1000)

--------首先生成排序方法---------

--if @sort=0 --公升序

--begin

if @fldsort <>''

set @sqlsort = ' order by ' + @fldsort

else

set @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='' --沒有設定顯示條件

begin

set @sqltmp = @fldname + ' from ' + @tblname

set @strtmp = 'select @counts=count(' + @id + ') from '+@tblname

set @strid = ' from ' + @tblname+ ' '+@sqlsort

endelse

begin

set @sqltmp = + @fldname + 'from ' + @tblname

set @strtmp = 'select @counts=count(' + @id + ') from '+@tblname + ' where ' + @strcondition

set @strid = ' from ' + @tblname + ' where ' + @strcondition + ' '+@sqlsort

end--print @strid

----取得查詢結果總數量-----

exec sp_executesql @strtmp,n'@counts int out ',@counts out

--取得分頁總數

if @counts <= @pagesize

set @pagecount = 1

else

begin

if @counts%@pagesize=0

set @pagecount = (@counts / @pagesize)

else

set @pagecount = (@counts / @pagesize) + 1

endset @topstr=' top '+convert(nvarchar,@pagesize)

--計算要移動的記錄數

if @page = 1 --加快處理

begin

-----取得分頁後此頁的第一條記錄的id

set @conditionstr=''

end

else

begin

-----取得分頁後此頁的第一條記錄的id

if @pagecount>1

begin

declare @topnum int

set @topnum=(@page-1)*@pagesize

set @conditionstr=' '+@id+' not in(select top '+ convert(nvarchar,@topnum)+' '+@id+' from '+@tblname+@sqlsort+')'

endelse

set @conditionstr=''

end

--print @strid

if @beginid>@endid

begin

set @tempid=@beginid

set @beginid=@endid

set @endid=@tempid

end------恢復系統設定-----

set rowcount 0

set nocount on

------返回查詢結果-----

if @strcondition=''

begin

if @conditionstr=''

set @strtmp = 'select ' + @topstr + ' ' + @sqltmp

else

set @strtmp = 'select ' + @topstr + ' ' + @sqltmp + ' where ' + @conditionstr

endelse

begin

if @conditionstr=''

set @strtmp = 'select ' + @topstr + ' ' + @sqltmp + ' where ' + @strcondition

else

set @strtmp = 'select ' + @topstr + ' ' + @sqltmp + ' where ' + @strcondition +' and '+@conditionstr

end--if @conditionstr<>''

--set @strtmp=@strtmp+@conditionstr

if @sqlsort<>''

set @strtmp = @strtmp+@sqlsort

--print @strtmp

--print @topstr

exec sp_executesql @strtmp

百萬級SQL分頁儲存過程

百萬級sql分頁儲存過程,請尊重原作者資訊.我只是更新一部分資料,原作者在分頁的處理過程中有一點錯誤.檢測了程式.發現並休正過來的.descript 分頁儲存過程 author blue.dream date 2004 8 18 21 01 update xqf222 date 18 11 2007...

oracle高效分頁儲存過程(百萬資料級)

create or replace procedure pager page in number,資料頁數,從1開始 pagesize in number,每頁大小 tablename nvarchar2,表名strwhere nvarchar2,where條件 orderby nvarchar2,...

千萬級分頁儲存過程

create procedure pagination jhgl tbname varchar 255 表名 tbfields varchar 1000 返回字段 orderfield varchar 255 排序的欄位名 pagesize int,頁尺寸 pageindex int,頁碼 orde...