千萬數量級分頁儲存過程 可支援多表查詢,任意排序

2021-04-20 08:17:49 字數 3933 閱讀 2283

create procedure usp_paginglarge

@tablenames varchar(200),      --表名,可以是多個表,但不能用別名

@primarykey varchar(100),      --主鍵,可以為空,但@order為空時該值不能為空

@fields      varchar(200),          --要取出的字段,可以是多個表的字段,可以為空,為空表示select *

@pagesize int,              --每頁記錄數

@currentpage int,          --當前頁,0表示第1頁

@filter varchar(200) = '',      --條件,可以為空,不用填 where

@group varchar(200) = '',      --分組依據,可以為空,不用填 group by

@order varchar(200) = ''      --排序,可以為空,為空缺省按主鍵公升序排列,不用填 order by

as

begin

declare @sortcolumn varchar(200)

declare @operator char(2)

declare @sorttable varchar(200)

declare @sortname varchar(200)

if @fields = ''

set @fields = '*'

if @filter = ''

set @filter = 'where 1=1'

else

set @filter = 'where ' +    @filter

if @group <>''

set @group = 'group by ' + @group

if @order <> ''

begin

declare @pos1 int, @pos2 int

set @order = replace(replace(@order, ' asc', ' asc'), ' desc', ' desc')

if charindex(' desc', @order) > 0

if charindex(' asc', @order) > 0

begin

if charindex(' desc', @order) < charindex(' asc', @order)

set @operator = '<='

else

set @operator = '>='

end

else

set @operator = '<='

else

set @operator = '>='

set @sortcolumn = replace(replace(replace(@order, ' asc', ''), ' desc', ''), ' ', '')

set @pos1 = charindex(',', @sortcolumn)

if @pos1 > 0

set @sortcolumn = substring(@sortcolumn, 1, @pos1-1)

set @pos2 = charindex('.', @sortcolumn)

if @pos2 > 0

begin

set @sorttable = substring(@sortcolumn, 1, @pos2-1)

if @pos1 > 0

set @sortname = substring(@sortcolumn, @pos2+1, @pos1-@pos2-1)

else

set @sortname = substring(@sortcolumn, @pos2+1, len(@sortcolumn)-@pos2)

end

else

begin

set @sorttable = @tablenames

set @sortname = @sortcolumn

end

end

else

begin

set @sortcolumn = @primarykey

set @sorttable = @tablenames

set @sortname = @sortcolumn

set @order = @sortcolumn

set @operator = '>='

end

declare @type varchar(50)

declare @prec int

select @type=t.name, @prec=c.prec

from sysobjects o

join syscolumns c on o.id=c.id

join systypes t on c.xusertype=t.xusertype

where o.name = @sorttable and c.name = @sortname

if charindex('char', @type) > 0

set @type = @type + '(' + cast(@prec as varchar) + ')'

declare @toprows int

set @toprows = @pagesize * @currentpage + 1

print @toprows

print @operator

exec('

declare @sortcolumnbegin ' + @type + '

set rowcount ' + @toprows + '

select @sortcolumnbegin=' + @sortcolumn + ' from    ' + @tablenames + ' ' + @filter + ' ' + @group + ' order by ' + @order + '

set rowcount ' + @pagesize + '

select ' + @fields + ' from    ' + @tablenames + ' ' + @filter    + ' and ' + @sortcolumn + '' + @operator + '@sortcolumnbegin ' + @group + ' order by ' + @order + '    

')    

end

go

--呼叫例子:

--1.單錶/單排序

exec usp_paginglarge 'bigtable','d_id','d_id,d_title,d_content,d_time',20,1,'','','d_id desc'

--2.單錶/多排序

exec usp_paginglarge 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'

--3.多表/單排序

exec usp_paginglarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.bigtable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_id asc'

--4.多表/多排序

exec usp_paginglarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.bigtable_id', 'bigtable

千萬數量級分頁儲存過程 可支援多表查詢,任意排序

create procedure usp paginglarge tablenames varchar 200 表名,可以是多個表,但不能用別名 primarykey varchar 100 主鍵,可以為空,但 order為空時該值不能為空 fields varchar 200 要取出的字段,可以是...

千萬數量級分頁儲存過程,可支援多表查詢,任意排序

從程式中考慮 比如用資料緩衝和連線池技術 從資料庫伺服器端考慮 比如csdn只選出前300行紀錄,因為使用者不需要那麼多紀錄。你也不必把1000萬條全部分頁。你也不必把紀錄放在乙個表中,一年 太多就乙個月 的資料放一張表或定期把歷史資料匯出到資料資料倉儲中,不要用一張表裝1000萬條記錄。做好索引。...

高效多表分頁儲存過程,可支援多表查詢,任意排序

create procedure usp paginglarge tablenames varchar 200 表名,可以是多個表,但不能用別名 primarykey varchar 100 主鍵,可以為空,但 order為空時該值不能為空 fields varchar 4000 要取出的字段,可以...