關於使用儲存過程建立分頁

2021-03-31 10:31:42 字數 2873 閱讀 5558

今天查詢有關sql server 索引的資料 無意在一篇文章的末尾發現乙個關於使用儲存過程建立分頁的**,直接複製到查詢分析器裡有誤,整理除錯了乙個,搬上來一起學習一下。

注:原作者 freedk  以下為筆者整理 這是乙個相對最優的方法在大量資料集中表現突出

建立乙個 web 應用,分頁瀏覽功能必不可少。這個問題是資料庫處理中十分常見的問題。經典的資料分頁方法是:ado 紀錄集分頁法,也就是利用ado自帶的分頁功能(利用游標)來實現分頁。但這種分頁方法僅適用於較小資料量的情形,因為游標本身有缺點:游標是存放在記憶體中,很費記憶體。游標一建立,就將相關的記錄鎖住,直到取消游標。游標提供了對特定集合中逐行掃瞄的手段,一般使用游標來逐行遍歷資料,根據取出資料條件的不同進行不同的操作。而對於多表和大表中定義的游標(大的資料集合)迴圈很容易使程式進入乙個漫長的等待甚至宕機。

更重要的是,對於非常大的資料模型而言,分頁檢索時,如果按照傳統的每次都載入整個資料來源的方法是非常浪費資源的。現在流行的分頁方法一般是檢索頁面大小的塊區的資料,而非檢索所有的資料,然後單步執行當前行。

儲存過程:

create procedure pagination3

@tblname varchar(255) , -- 表名

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

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

@pagesize int = 10, -- 頁尺寸

@pageindex int = 1, -- 頁碼

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

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

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

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

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

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

if @docount != 0

begin

if @strwhere !=''

set @strsql = 'select count(*)  total from  where '+@strwhere

else

set @strsql = 'select count(*)  total from '

end

--以上**的意思是如果@docount傳遞過來的不是0,就執行總數統計。以下的所有**都是@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'

endif @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

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 + '(['

+ @fldname + ']) from (select top ' + str((@pageindex-1)*@pagesize) + ' ['

+ @fldname + '] from [' + @tblname + '] where ' + @strwhere + ' '

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

endend

exec (@strsql)

--print @strsql

go以上**在winxp_sp2   sql server2000 personal 下除錯通過

Orcale建立分頁儲存過程

create or replace package mypage as type page cursor is ref cursor procedure get page col varchar2,要查詢的列 page table varchar2,表名 可有多張 page where varcha...

SQL Server 建立分頁儲存過程

sql server 建立分頁儲存過程 分頁儲存過程 建立 create proc usp pagescore page int,頁數 count int,條數 sumpage int output 總頁數as begin 獲取總頁數,ceiling表示向上取整 set sumpage ceilin...

使用儲存過程分頁

use oa go object storedprocedure dbo spgetbypage script date 11 05 2014 13 01 37 set ansi nulls on goset quoted identifier on goalter procedure dbo sp...