百萬級SQL分頁儲存過程

2021-08-22 09:28:48 字數 3664 閱讀 4072

/*百萬級sql分頁儲存過程,請尊重原作者資訊.我只是更新一部分資料,原作者在分頁的處理過程中有一點錯誤.檢測了程式.發現並休正過來的.

descript:分頁儲存過程

author:blue.dream

date:2004-8-18 21:01

update:xqf222

date:18:11 2007-6-29

*/create procedure sp_millionpagedata4(

@tblname nvarchar(200), ----要顯示的表或多個表的連線

@fldname nvarchar(200) = '*', ----要顯示的字段列表

@pagesize int = 100, ----每頁顯示的記錄個數

@page int = 1, ----要顯示那一頁的記錄

@pagecount int = 1 output, ----查詢結果分頁後的總頁數

@counts int = 1 output, ----查詢到的記錄數

@id nvarchar(50), ----主表的主鍵

@fldsort nvarchar(100) = null, ----排序字段列表或條件

@sort bit = 0, ----排序方法,0為公升序,1為降序

@strcondition nvarchar(200) = null ----查詢條件,不需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

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

if @sort=0 --公升序

begin

if not(@fldsort is null)

set @sqlsort = ' order by ' + @fldsort

else

set @sqlsort = ' order by ' + @id

endelse --降序

begin

if not(@fldsort is null)

set @sqlsort = ' order by ' + @fldsort + ' desc'

else

set @sqlsort = ' order by ' + @id + ' desc '

end--------生成查詢語句--------

--此處@strtmp為取得查詢結果數量的語句

if @strcondition is null --沒有設定顯示條件

begin

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

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

set @strid = ' from ' + @tblname

endelse

begin

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

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

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

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

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

--取得分頁總數

if @counts <= @pagesize

set @pagecount = 1

else

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

--計算要移動的記錄數

if @page = 1 --加快處理

begin

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

set @strid = 'select @beginid=' + @id + ' ' + @strid

set @intcounts = 1

set rowcount @intcounts

exec sp_executesql @strid,n'@beginid int out ',@beginid out

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

set rowcount @pagesize

exec sp_executesql @strid,n'@beginid int out ',@endid out

end

else

begin

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

set @strid = 'select @beginid=' + @id + ' ' + @strid

set @intcounts =(@page-1)* @pagesize+1

set rowcount @intcounts

exec sp_executesql @strid,n'@beginid int out ',@beginid out

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

set @intcounts = @intcounts + @pagesize - 1

set rowcount @intcounts

exec sp_executesql @strid,n'@beginid int out ',@endid out

set @intcounts = (@pagecount-1)* @pagesize

end

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

set rowcount 0

set nocount on

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

if @strcondition is null

set @strtmp = 'select ' + @sqltmp + ' where ' + @id + ' between ' + str(@beginid) + ' and ' + str(@endid)

else

set @strtmp = 'select ' + @sqltmp + ' where ' + @id +' (between ' + str(@beginid) + ' and ' + str(@endid) + ') and ' + @strcondition

if not(@sqlsort is null)

set @strtmp = @strtmp + @sqlsort

exec sp_executesql @strtmp

go

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

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

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

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

sql 儲存過程分頁

create proc myx prpagerecordset querystr nvarchar 1000 keyfield nvarchar 200 pagesize int,pagenumber int as begin declare sqltext as nvarchar 4000 dec...