set quoted_identifier on
goset ansi_nulls off
go/*
declare @p1 int
set @p1=null
exec sp_pageview @tbname = n'v_question_list', @fieldkey = n'id', @pagecurrent = 3, @pagesize = 10, @fieldshow = n'', @fieldorder = n'id', @where = n'projectid=3', @pagecount = @p1 output
select @p1
*/alter
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')'
declare @querystring varchar(2000)
set @querystring = 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
print @querystring
--執行查詢
exec(@querystring)
endgo
set quoted_identifier off
goset ansi_nulls on
go
通用儲存過程 分頁儲存過程
名稱 spall returnrows 輸入 輸出 呼叫 exec spall returnrows select from 表名 頁號,返回記錄數,主鍵 排序字段 spall returnrows select from all categories 2,10,id id 說明 百萬級 通用儲存過...
通用分頁儲存過程
create procedure sp page strtable varchar 50 表名 strcolumn varchar 50 按該列來進行分頁 intcoltype int,strcolumn列的型別,0 數字型別,1 字元型別,2 日期時間型別 intorder bit,排序,0 順序...
通用分頁儲存過程
通用分頁儲存過程 create proc commonpagination columns varchar 500 要顯示的列名,用逗號隔開 tablename varchar 100 要查詢的表名 ordercolumnname varchar 100 排序的列名 order varchar 50...