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

2021-04-28 07:45:48 字數 3275 閱讀 6287

/***鄒建*/
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

)end

end

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

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

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,每頁的大小 記錄...