乙個高效的資料分頁的儲存過程 可以輕鬆應付百萬資料

2021-09-05 16:38:09 字數 3642 閱讀 4280

程式**

create procedure pagetest --用於翻頁的測試

--需要把排序字段放在第一列 (

@firstid nvarchar(20)=null, --當前頁面裡的第一條記錄的排序欄位的值

@lastid nvarchar(20)=null, --當前頁 麵裡的最後一條記錄的排序欄位的值

@allcount int output, --返回總記錄數

@pagesize int output, --返回一頁的記錄數

@curpage int --頁號(第幾頁)0:第一頁;-1最後一頁。 )

asif @curpage=0

begin

--統計總記錄數

select @allcount=count(productid) from product_test

set @pagesize=10

--返回第一頁的資料

select top 10

productid,

productname,

introduction

from product_test order by productid

endelse if @curpage=-1

select * from

(select top 10 productid,

productname,

introduction

from product_test order by productid desc ) as aa

order by productid

else

begin

if @isnext=1

select top 10 productid,

productname,

introduction

from product_test where productid > @lastid order by productid

else

select * from

(select top 10 productid,

productname,

introduction

from product_test where productid < @firstid order by productid desc) as bb order by productid

end 二

-- 獲取指定頁的資料

create procedure pagination

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

as declare @strsql varchar(5000) -- 主語句

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

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

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,就執行總數統計。以下的所有**都是@docount為0的情況

else

begin

if @ordertype != 0

begin

set @strtmp = "<(select min"

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

--如果@ordertype不是0,就執行降序,這句很重要!

end

else

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

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

end

else

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

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

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

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

end

end

exec (@strsql)

go

乙個高效的資料分頁的儲存過程

create procedure pagetest 用於翻頁的測試 需要把排序字段放在第一列 asif curpage 0 begin 統計總記錄數 select allcount count productid from product test set pagesize 10 返回第一頁的資料 ...

乙個高效的資料分頁的儲存過程

高效的資料分頁的儲存過程 create procedure pagetest 用於翻頁的測試 需要把排序字段放在第一列 asif curpage 0 begin 統計總記錄數 select allcount count productid from product test set pagesize...

乙個高效的分頁儲存過程

最近在做乙個幾百萬條資料的分頁查詢,研究了各種方案,在本機上用專案的實際資料庫做測試,測試過程 is very 痛苦,不堪回首ing。現在廢話不多說,直接上結果,相信這也是大多數搜尋答案的人最願意看的方式。以下是儲存過程的 1 create procedure dbo p gridviewpager...