鄒老大的分頁sql儲存過程

2021-04-09 06:49:09 字數 3799 閱讀 4481

--csdn.net鄒建  --*/

/*--呼叫示例

exec p_show '地區資料'

exec p_show 'select top 100 percent * from 地區資料 order by 地區名稱',5,3,'地區編號,地區名稱,助記碼'

--*/

/*建立 p_show*/

create proc p_show

@querystr nvarchar(4000), --表名、檢視名、查詢語句

@pagesize int=20,   --每頁的大小(行數)

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

@fdshow nvarchar (4000)='', --要顯示的字段列表,如果查詢結果不需要標識字段,需要指定此值,且不包含標識字段

@fdorder nvarchar (1000)='' --排序字段列表

asset nocount on

declare @fdname nvarchar(250) --表中的主鍵或表、臨時表中的標識列名

,@id1 varchar(20),@id2 varchar(20) --開始和結束的記錄號

,@obj_id int    --物件id

--表中有復合主鍵的處理

declare @strfd nvarchar(2000) --復合主鍵列表

,@strjoin nvarchar(4000) --連線字段

,@strwhere nvarchar(2000) --查詢條件

select @obj_id=object_id(@querystr)

,@fdshow=case isnull(@fdshow,'') when '' then ' *' else ' '+@fdshow end

,@fdorder=case isnull(@fdorder,'') when '' then '' else ' order by '+@fdorder end

,@querystr=case when @obj_id is not null then ' '+@querystr else ' ('+@querystr+') a' end

--如果顯示第一頁,可以直接用top來完成

if @pagecurrent=1

begin

select @id1=cast(@pagesize as varchar(20))

exec('select top '+@id1+@fdshow+' from '+@querystr+@fdorder)

return

end--如果是表,則檢查表中是否有標識更或主鍵

if @obj_id is not null and objectproperty(@obj_id,'istable')=1

begin

select @id1=cast(@pagesize as varchar(20))

,@id2=cast((@pagecurrent-1)*@pagesize as varchar(20))

select @fdname=name from syscolumns where id=@obj_id and status=0x80

if @@rowcount=0   --如果表中無標識列,則檢查表中是否有主鍵

begin

if not exists(select 1 from sysobjects where parent_obj=@obj_id and xtype='pk')

goto lbusetemp  --如果表中無主鍵,則用臨時表處理

select @fdname=name from syscolumns where id=@obj_id and colid in(

select colid from sysindexkeys where @obj_id=id and indid in(

select indid from sysindexes where @obj_id=id and name in(

select name from sysobjects where xtype='pk' and parent_obj=@obj_id

)))if @@rowcount>1  --檢查表中的主鍵是否為復合主鍵

begin

select @strfd='',@strjoin='',@strwhere=''

select @strfd=@strfd+',['+name+']'

,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'

,@strwhere=@strwhere+' and b.['+name+'] is null'

from syscolumns where id=@obj_id and colid in(

select colid from sysindexkeys where @obj_id=id and indid in(

select indid from sysindexes where @obj_id=id and name in(

select name from sysobjects where xtype='pk' and parent_obj=@obj_id

)))select @strfd=substring(@strfd,2,2000)

,@strjoin=substring(@strjoin,5,4000)

,@strwhere=substring(@strwhere,5,4000)

goto lbusepk

endend

endelse

goto lbusetemp

/*--使用標識列或主鍵為單一欄位的處理方法--*/

lbuseidentity:

exec('select top '+@id1+@fdshow+' from '+@querystr

+' where '+@fdname+' not in(select top '

+@id2+' '+@fdname+' from '+@querystr+@fdorder

+')'+@fdorder

)return

/*--表中有復合主鍵的處理方法--*/

lbusepk: 

exec('select '+@fdshow+' from(select top '+@id1+' a.* from

(select top 100 percent * from '+@querystr+@fdorder+') a

left join (select top '+@id2+' '+@strfd+'

from '+@querystr+@fdorder+') b on '+@strjoin+'

where '+@strwhere+') a'

)return

/*--用臨時表處理的方法--*/

lbusetemp: 

select @fdname='[id_'+cast(newid() as varchar(40))+']'

,@id1=cast(@pagesize*(@pagecurrent-1) as varchar(20))

,@id2=cast(@pagesize*@pagecurrent-1 as varchar(20))

exec('select '+@fdname+'=identity(int,0,1),'+@fdshow+'

into #tb from'+@querystr+@fdorder+'

select '+@fdshow+' from #tb where '+@fdname+' between '

+@id1+' and '+@id2

)go 

鄒建SQL Server通用分頁儲存過程

鄒建sql server通用分頁儲存過程 資源概述 csdn社群sql server版大版主鄒建的sql server通用分頁儲存過程。內容摘錄 用儲存過程實現的分頁程式 顯示指定表 檢視 查詢結果的第x頁 對於表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法 如果檢視或查詢結果...

sql 儲存過程分頁

create proc myx prpagerecordset querystr nvarchar 1000 keyfield nvarchar 200 pagesize int,pagenumber int as begin declare sqltext as nvarchar 4000 dec...

SQL 儲存過程 分頁

1.俄羅斯儲存過程 的改良版 create procedure pagination1 pagesize int,頁面大小,如每頁儲存20條記錄 pageindex int 當前頁碼 as set nocount on begin declare indextable table id int id...