海量資料的分頁

2021-04-13 05:45:44 字數 3578 閱讀 1797

第一種方法:

declare @pagesize int,@currpage int,

@topnum int,@previous int

select @pagesize = 30

select @currpage = 2

select @topnum = @currpage * @pagesize

select @previous = (@currpage - 1) * @pagesize

declare @i int,@idstr nvarchar(500),@strsql nvarchar(1000)

select @i = 0

select @strsql = n''

select @strsql = @strsql + n' select top '+str(@topnum)+ ' @i = @i + 1 '

select @strsql = @strsql + n',  @idstr = '

select @strsql = @strsql + n'case when @i > '+str(@previous)+' then  @idstr + ltrim(rtrim(str(orderid))) + '','' '

select @strsql = @strsql + n'else n''''end '

select @strsql = @strsql + n'from orders '

select @strsql = ltrim(rtrim(@strsql)) + n' order by orderid desc '

select @idstr = n''

exec sp_executesql @strsql,n'@i int,@idstr varchar(500) output',@i,@idstr output

if len(rtrim(ltrim(@idstr))) > 0

begin

select @idstr = left(@idstr,len(@idstr)-1)

endselect @strsql = 'select * from orders where orderid in ('+@idstr+')'

exec(@strsql) 

第2種方法

create    procedure proc_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

set nocount on

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,就執行降序,這句很重要!

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

--以下**賦予了@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)

海量資料分頁

language vbscript codepage 936 分頁sql語句生成 function getpagesql tblname,fldname,pagesize,pageindex,ordertype,strwhere dim strtemp,strsql,strorder 根據排序方式生...

海量資料分頁查詢

select top 25 id,registerid,filenameid,createtime from tbfilenamerecord where id select min id from select top 100 id from tbfilenamerecord where regi...

海量資料的分頁怎麼破

分頁應該是極為常見的資料展現方式了,一般在資料集較大而無法在單個頁面中呈現時會採用分頁的方法。各種前端ui元件在實現上也都會支援分頁的功能,而資料互動呈現所相應的後端系統 資料庫都對資料查詢的分頁提供了良好的支援。以幾個流行的資料庫為例 查詢表 t data 第 2 頁的資料 假定每頁 5 條 db...