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...