大資料量分頁的儲存過程(轉,沒有試驗過)不過很好

2021-04-13 09:52:49 字數 4332 閱讀 2619

create proc sp_publicturnpagewebsite(

@tbname  nvarchar(100)='', --表名,如 pinyin

@pagesize int=10,   --每頁的記錄數,預設為 10

@curpage int=1,   --表示當前頁 1

@keyfield nvarchar(100)='id', --關鍵欄位名,預設為 id,該欄位要求是表中的索引 或 無重複和不為空的字段

@keyascdesc nvarchar(4)='asc', --關鍵字的公升、降序,預設為公升序 asc , 降序為 desc

@fields  nvarchar(500)='*', --所選擇的列名,預設為全選

@condition nvarchar(200)='', --where 條件,預設為空

@order  nvarchar(200)='' --排序條件,預設為空

) with encryption as

if @tbname = ''

begin

raiserror('請指定表名!',11,1)

return

endif @pagesize <=0 or @curpage <0 

begin

raiserror('當前頁數和每頁的記錄數都必須大於零!',11,1)

return

endif @keyascdesc = 'desc'

set @keyascdesc = '<'

else

set @keyascdesc = '>'

if @condition <> ''

set @condition = ' where ' + @condition

declare @sql nvarchar(2000)

set @sql = ''

if @curpage = 1

set @sql = @sql + 'select top ' + cast(@pagesize as nvarchar(20)) + ' ' + @fields + ' from ' + @tbname + @condition + ' ' + @order

else

begin

declare @itopnum int

set @itopnum = @pagesize * (@curpage - 1)

set @sql = @sql + 'declare @slastvalue nvarchar(100)' + char(13)

set @sql = @sql + 'select top ' + cast(@itopnum as nvarchar(20)) + ' @slastvalue=' + @keyfield + ' from ' + @tbname + @condition + ' ' + @order + char(13)

declare @condition2 nvarchar(200)

if @condition = ''

set @condition2 = ' where ' + @keyfield + @keyascdesc + '@slastvalue '

else

set @condition2 = ' and ' + @keyfield + @keyascdesc + '@slastvalue '

set @sql = @sql + 'select top ' + cast(@pagesize as nvarchar(20)) + ' ' + @fields + ' from ' + @tbname + @condition + @condition2 + @order

endexecute sp_executesql @sql 

下面的這個分頁,專案開發中使用過

create procedure pagination

@tblname varchar(2500) , -- 表名

@strgetfields varchar(1000) = '*', -- 需要返回的列

@fldname varchar(255)='', -- 排序的欄位名

@pagesize int = 10, -- 頁尺寸

@pageindex int = 1, -- 頁碼

@docount bit = 0, -- 返回記錄總數, 非 0 值則返回

@ordertype bit = 0, -- 設定排序型別, 非 0 值則降序

@strwhere varchar(2500) = '' -- 查詢條件 (注意: 不要加 where)

asdeclare @strsql varchar(5000) -- 主語句

declare @strtmp varchar(110) -- 臨時變數

declare @strorder varchar(400) -- 排序型別

--declare @strfldname varchar(255) --對排序的欄位名進行處理

--如果@docount傳遞過來的不是0,就執行總數統計

if @docount != 0

begin

if @strwhere !=''

set @strsql = "select count(*) as total from " + @tblname + " where "+@strwhere

else

set @strsql = "select count(*) as total from " + @tblname

end

-- @docount為0的情況

else

begin

if @ordertype != 0

begin

set @strtmp = "<(select min"

set @strorder = " order by " + @fldname +" desc"

-- 如果@ordertype不是0,就執行降序,

endelse

begin

set @strtmp = ">(select max"

set @strorder = " order by " + @fldname +" asc"

end--如果是第一頁就執行以上**,這樣會加快執行速度

if @pageindex = 1

begin

if @strwhere != ''

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ "

from " + @tblname + " where " + @strwhere + " " + @strorder

else

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ "

from "+ @tblname + " "+ @strorder

endelse

begin

--賦予了@strsql以真正執行的sql** 

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ " from "

+ @tblname + " where " + @fldname +  @strtmp + "("+ @fldname + ")

from (select top " + str((@pageindex-1)*@pagesize) + " "+ @fldname + "

from " + @tblname + " " + @strorder + ") as tbltmp)"+ @strorder

if @strwhere != ''

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ " from "

+ @tblname + " where " + @fldname +  @strtmp + "("+cast(substring(""+@fldname+"",charindex(".",""+@fldname+"")+1,len(""+@fldname+"")-charindex(".",""+@fldname+""))

as char)+") from (select top " + str((@pageindex-1)*@pagesize) + " "

+ @fldname + " from " + @tblname + " where " + @strwhere + " "

+ @strorder + ") as tbltmp) and " + @strwhere + " " + @strorder

end

end

exec (@strsql)

go

Oracle大資料量分頁通用儲存過程

v sql select from select a.rownum rn from p sqlselect a where rownum to char v heirownum bwhere rn to char v lowrownum 注意對rownum別名的使用,第一次直接用rownum,第二次...

Oracle通用大資料量儲存過程分頁修正版

通用大資料量儲存過程分頁 在本地使用過程中發現有點不適合專案需求,所以抽時間修正了下,具體的不完善的地方表現為 1 在第一頁搜尋的時候可以正常搜尋出資訊,但是如果跳轉到地2頁以後的分頁上再搜尋的時候就會出現找不到記錄 2 在比較大的的分頁上搜尋出多條記錄時,如果搜尋出來的記錄的總頁數比當前頁碼小,也...

大資料量分頁優化

用limit offset 時並不是先跳過再查詢 而是 先查詢,再跳過 limit 100w,10 先把100w取出來,然後跳過前100w行,所以大資料分頁用limit很慢 select id,name from lx com 5000000,10 先查詢出來5000000 select id,na...