可支援多表查詢,任意排序的SQL2000儲存過程。

2022-02-10 23:40:46 字數 3730 閱讀 8276

原位址忘了,好像是沒有統計總數和頁數,簡單的加了乙個

1000萬資料第一頁到最後一頁,用時3-4秒左右

create procedure usp_paginglarge

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

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

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

@pagesize int, --每頁記錄數

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

@rowscount int output, --總記錄

@maxpage int output, --總頁數

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

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

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

asbegin

declare @sortcolumn varchar(200)

declare @operator char(2)

declare @sorttable varchar(200)

declare @sortname varchar(200)

--獲取總記錄數

declare @strtmp nvarchar(1000) ----存放動態生成的sql語句

set @strtmp = 'select @rowscount = count(0) from '+@tablenames + ' where (1>0)'

exec sp_executesql @strtmp,n'@rowscount int out ',@rowscount out

--計算總頁數

if(@rowscount%@pagesize)=0

begin

set @maxpage=(@rowscount/@pagesize)

endelse

begin

set @maxpage=(@rowscount/@pagesize)+1

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

endelse

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)

endelse

begin

set @sorttable = @tablenames

set @sortname = @sortcolumn

endend

else

begin

set @sortcolumn = @primarykey

set @sorttable = @tablenames

set @sortname = @sortcolumn

set @order = @sortcolumn

set @operator = '>='

enddeclare @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 + '

')

endgo

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

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

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

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

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

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