字串快取實現的通用分頁儲存過程

2021-06-04 23:08:00 字數 3042 閱讀 6540

create proc sp_pageview

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

@fieldkey sysname, --用於定位記錄的主鍵(惟一鍵)字段,只能是單個字段

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

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

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

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

用於指定排序順序

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

@pagecount int output --總頁數

asdeclare @sql nvarchar(4000)

set 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

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*@pagesize

--第一頁直接顯示

if @pagecurrent=1

exec(n'select top '+@topn

+n' '+@fieldshow

+n' from '+@tbname

+n' '+@where

+n' '+@fieldorder)

else

begin

select @pagecurrent=@topn1,

@sql=n'select @n=@n-1,@s=case when @n<'+@topn

+n' then @s+n'',''+quotename(rtrim(cast('+@fieldkey

+n' as varchar(8000))),n'''''''') else n'''' end from '+@tbname

+n' '+@where

+n' '+@fieldorder

set rowcount @pagecurrent

exec sp_executesql @sql,

n'@n int,@s nvarchar(4000) output',

@pagecurrent,@sql output

set rowcount 0

if @sql=n''

exec(n'select top 0'

+n' '+@fieldshow

+n' from '+@tbname)

else

begin

set @sql=stuff(@sql,1,1,n'')

--執行查詢

exec(n'select top '+@topn

+n' '+@fieldshow

+n' from '+@tbname

+n' where '+@fieldkey

+n' in('+@sql

+n') '+@fieldorder)

endend

字串快取實現的通用分頁儲存過程

鄒建 create proc sp pageview tbname sysname,要分頁顯示的表名 fieldkey sysname,用於定位記錄的主鍵 惟一鍵 字段,只能是單個字段 pagecurrent int 1,要顯示的頁碼 pagesize int 10,每頁的大小 記錄數 fields...

TOP n 實現的通用分頁儲存過程

鄒建 create proc sp pageview tbname sysname,要分頁顯示的表名 fieldkey nvarchar 1000 用於定位記錄的主鍵 唯一性 字段,可以是逗號分隔的多個字段 pagecurrent int 1,要顯示的頁碼 pagesize int 10,每頁的大小...

TOP n 實現的通用分頁儲存過程

create proc sp pageview tbname sysname,要分頁顯示的表名 fieldkey nvarchar 1000 用於定位記錄的主鍵 唯一性 字段,可以是逗號分隔的多個字段 pagecurrent int 1,要顯示的頁碼 pagesize int 10,每頁的大小 記錄...