傳說中的分頁4

2021-06-15 21:25:34 字數 4265 閱讀 4824

if exists (select * from sysobjects where type = 'p' and name = 'page')

begin

print 'dropping procedure page'

drop  procedure  page

endgo

print 'creating procedure page'

gocreate procedure page

/* param list */

@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

asbegin

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

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

--呼叫例子:

--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.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'

posted on 2006-08-16 19:23 曇花一現

編輯

傳說中的分頁6

set quoted identifier off goset ansi nulls on go 名稱 分頁儲存過程 使用示例 exec sp pageindex from stusources 2,10 注意 目前還沒有對輸入的引數進行嚴格的驗證 預設為輸入都是合法有效的 alter proc s...

傳說中的MTU

通訊術語 最大傳輸單元 maximum transmission unit,mtu 是指一種通訊協議的某一層上面所能通過的最大資料報大小 以位元組為單位 最大傳輸單元這個引數通常與通訊介面有關 網路介面卡 串列埠等 網際網路協議允許ip分片,這樣就可以將資料報分成足夠小的片段以通過那些最大傳輸單元小...

傳說中的truncate html

學習用rails做blog的時候要用到rails的truncate功能。h truncate post.content,100,問題來了,將html截斷後出現不完整的tag,導致後續的文章排版都錯亂了。本來考慮是不是自己寫乙個,正在思考思路,結果祭起google,好嗎,已經有牛人寫了 簡單記錄一下 ...