大牛的分頁儲存過程

2021-05-17 16:08:30 字數 3637 閱讀 7599

/*--鄒建 2003.09(引用請保留此資訊)--*/

create proc sp_pageview

@tbname     sysname,               --要分頁顯示的表名

@fieldkey   nvarchar(1000),      --用於定位記錄的主鍵(惟一鍵)字段,可以是逗號分隔的多個字段

@pagecurrent int=1,               --要顯示的頁碼

@pagesize   int=10,                --每頁的大小(記錄數)

@fieldshow nvarchar(1000)='',      --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段

@fieldorder nvarchar(1000)='',      --以逗號分隔的排序字段列表,可以指定在字段後面指定desc/asc                                          用於指定排序順序

@where    nvarchar(1000)='',     --查詢條件

@pagecount int output             --總頁數

asset nocount on

--檢查物件是否有效

if object_id(@tbname) is null

begin

raiserror(n'物件"%s"不存在',1,16,@tbname)

return

endif objectproperty(object_id(@tbname),n'istable')=0

and objectproperty(object_id(@tbname),n'isview')=0

and objectproperty(object_id(@tbname),n'istablefunction')=0

begin

raiserror(n'"%s"不是表、檢視或者錶值函式',1,16,@tbname)

return

end--分頁字段檢查

if isnull(@fieldkey,n'')=''

begin

raiserror(n'分頁處理需要主鍵(或者惟一鍵)',1,16)

return

end--其他引數檢查及規範

if isnull(@pagecurrent,0)<1 set @pagecurrent=1

if isnull(@pagesize,0)<1 set @pagesize=10

if isnull(@fieldshow,n'')=n'' set @fieldshow=n'*'

if isnull(@fieldorder,n'')=n''

set @fieldorder=n''

else

set @fieldorder=n'order by '+ltrim(@fieldorder)

if isnull(@where,n'')=n''

set @where=n''

else

set @where=n'where ('+@where+n')'

--如果@pagecount為null值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以後呼叫時,把總頁數傳回給儲存過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@pagecount賦值)

if @pagecount is null

begin

declare @sql nvarchar(4000)

set @sql=n'select @pagecount=count(*)'

+n' from '+@tbname

+n' '+@where

exec sp_executesql @sql,n'@pagecount int output',@pagecount output

set @pagecount=(@pagecount+@pagesize-1)/@pagesize

end--計算分頁顯示的topn值

declare @topn varchar(20),@topn1 varchar(20)

select @topn=@pagesize,

@topn1=(@pagecurrent-1)*@pagesize

--第一頁直接顯示

if @pagecurrent=1

exec(n'select top '+@topn

+n' '+@fieldshow

+n' from '+@tbname

+n' '+@where

+n' '+@fieldorder)

else

begin

--處理別名

if @fieldshow=n'*'

set @fieldshow=n'a.*'

--生成主鍵(惟一鍵)處理條件

declare @where1 nvarchar(4000),@where2 nvarchar(4000),

@s nvarchar(1000),@field sysname

select @where1=n'',@where2=n'',@s=@fieldkey

while charindex(n',',@s)>0

select @field=left(@s,charindex(n',',@s)-1),

@s=stuff(@s,1,charindex(n',',@s),n''),

@where1=@where1+n' and a.'+@field+n'=b.'+@field,

@where2=@where2+n' and b.'+@field+n' is null',

@where=replace(@where,@field,n'a.'+@field),

@fieldorder=replace(@fieldorder,@field,n'a.'+@field),

@fieldshow=replace(@fieldshow,@field,n'a.'+@field)

select @where=replace(@where,@s,n'a.'+@s),

@fieldorder=replace(@fieldorder,@s,n'a.'+@s),

@fieldshow=replace(@fieldshow,@s,n'a.'+@s),

@where1=stuff(@where1+n' and a.'+@s+n'=b.'+@s,1,5,n''),   

@where2=case

when @where='' then n'where ('

else @where+n' and ('

end+n'b.'+@s+n' is null'+@where2+n')'

--執行查詢

exec(n'select top '+@topn

+n' '+@fieldshow

+n' from '+@tbname

+n' a left join(select top '+@topn1

+n' '+@fieldkey

+n' from '+@tbname

+n' a '+@where

+n' '+@fieldorder

+n')b on '+@where1

+n' '+@where2

+n' '+@fieldorder)

end

分頁儲存過程 分頁儲存過程

分頁儲存過程 alter proc dbo p pageshow pagesize int,每頁大小 currentpage int out,當前頁 housename nvarchar 50 房產名稱 totalcount int out,總記錄數 totalpage int out 總頁數 as...

分頁的儲存過程

alter procedure sql conn sort tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 頁尺寸 pageindex int 頁碼 doc...

儲存過程的分頁!!

create proc up gettopiclist a strforumid varchar 50 a intpageno int a intpagesize int as 定義區域性變數 declare intbeginid int declare intendid int declare i...