資料庫端分頁儲存過程

2021-04-13 06:52:46 字數 3250 閱讀 4502

近日專案中要用到大批量的資料分頁顯示,而vs2003中的datagrid中的分頁機制是整個的讀出資料到記憶體,再將記憶體中符合分頁條件的資料顯示到頁面,如果資料量達到一定程式會占用大量系統資源,導致整個程式反應遲鈍。 因而只好採用在資料庫端分頁的方法,每次只讀出指定的記錄數。

create  procedure dbo.proc_pagination  

(  

@tblname varchar(50),--查詢的表名或視

@pageindex int output ,    --查詢記錄頁碼數

@pagesize int ,     -- 每頁記錄數

@keyid  varchar(10),  --表或檢視的主鍵

@where varchar(200) = null ,   --條件表達

@order varchar(200)= null,   --排序表示式

@pagecount int output,   --總的頁數

@rowscount int output --總的記錄數)as

begin

if (@order is not null and  @order <> '')

begin

set @order = ' order by ' + @order

endif ( @pageindex < 1)

begin

set @pageindex = 1

end--計算總的記錄數

declare @strbyrows nvarchar(1000)

set @strbyrows = 'select @pages = count(*) from ' + @tblname

if ( @where is not null and @where <> '')

begin

set @strbyrows  =  @strbyrows +  ' where ' + @where

endexec sp_executesql @strbyrows,n'@pages int output',@rowscount output--計算總頁數

if ( @rowscount  > 0)

begin  

--計算總的頁數

if ( @rowscount % @pagesize = 0)

begin 

set @pagecount  = @rowscount/@pagesize

endelse

begin

set @pagecount  = @rowscount/@pagesize + 1

end--如果當前頁大於總的頁數,則設定當前頁碼為總的頁數

if ( @pageindex > @pagecount)

begin

set  @pageindex = @pagecount

end--查詢第n頁資料

declare @str varchar(8000)

declare @strbyin varchar(5000)

declare @strbynotin varchar(5000)

set  @strbyin = 'select top ' + convert(varchar(10),@pageindex * @pagesize) + ' '+ @keyid + ' from '+ @tblname

if ( @where is not null and @where <> '')

begin

set @strbyin = @strbyin + ' where ' + @where

endif ( @order is not null and @order <> '')

begin

set @strbyin = @strbyin + @order

endset @strbynotin = 'select top '  + convert(varchar(10), (@pageindex-1) * @pagesize) + ' '+ @keyid + ' from ' + @tblname

if ( @where is not null and @where <> '')

begin

set @strbynotin = @strbynotin + ' where ' + @where

endif ( @order is not null and @order <> '')

begin

set @strbynotin = @strbynotin  + @order

endset @str = 'select * from ' + @tblname

set @str = @str + ' where ' + @keyid + ' in(' + @strbyin + ') '

set @str = @str + ' and ' + @keyid + ' not in(' + @strbynotin + ') '

if ( @where is not null and @where <> '')

begin

set @str = @str + ' and ' + @where

endif ( @order is not null and @order <> '')

begin

set @str = @str + @order

endend

else

begin 

set @str = 'select  top 0 * from ' + @tblname

endexec(@str)

end儲存過程呼叫**

declare @pagecount int

declare  @rowscount int

declare @pageindex int

set @pageindex = 2

exec proc_pagination @tblname = 'tblname',@where = '',@order = 'id',@pageindex=@pageindex output ,@pagesize=100,@keyid='id',@pagecount = @pagecount output,@rowscount = @rowscount output

select @pagecount,@rowscount,@pageindex 

此儲存過程為一通用儲存過程,只要提供要查詢的表名事檢視名與查詢頁碼數、每頁記錄數等資訊就可以。

儲存過程還存在乙個小問題,如果讀取的資料的頁碼數字越大其效能越低速度越慢,暫未找到好的解決之法。

資料庫非儲存過程分頁

oracle中的分頁 select from select a.rownum rc from 表名 where rownum endrow a where a.rc startrow select a1.from select student.rownum rn from student a1 wh...

MSSQL MySQL 資料庫分頁 儲存過程

先看看單條 sql 語句的分頁 sql 吧。方法1 適用於 sql server 2000 2005 複製 如下 select top 頁大小 from table1 where id not in select top 頁大小 頁數 1 id frwww.cppcns.comom table1 o...

高效資料庫分頁儲存過程詳解

我們要把大量的資料分頁顯示,以前在asp裡或其它程式裡的做法是把資料全部取出來,然後根據不同的頁碼用程式去計算應該顯示哪部分,如果資料量過大的話,可以想像每次都要調出來很多沒用的資料,是不是會很慢呢,而分頁儲存過程解決了這一問題,每次只調出有用的資料,其餘部分的資料並不會傳輸到程式裡,這樣就給資料的...