可以多個字段排序的分頁儲存過程

2022-03-05 16:05:02 字數 3070 閱讀 2330

create proc sp_pagelist

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

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

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

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

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

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

--用於指定排序順序

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

@recordcount  int output,       --總記錄數

@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 @recordcount = @pagecount

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

go

可以依據任何字段進行排序並分頁的儲存過程

之前用過的一些儲存過程分頁 大多數都只能根據主鍵排序,可是實際上,我們經常需要依據非主鍵排序並分頁,比如,按工資大小 下面的 能完成工作 alter procedure dbo.getpagerecord tblname varchar 255 表名 fldname varchar 255 排序字段...

mysql order by多個字段排序

mysql order by 多個字段 排序規則 比如 如要根據configid和marketid來排序 有如下語句 select from table order by configid,marketid desc 那麼結果 分析 其實這個語句等同於 先按照configid公升序,再按照marke...

可按任意字段排序的分頁儲存過程

create procedure dbo.getpagingrecord tablename varchar 100 表名或檢視表 fieldlist varchar 4000 欲選擇字段列表 orderfield varchar 100 排序字段 keyfield varchar 100 主鍵 p...