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