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

2021-08-22 06:45:04 字數 4124 閱讀 4797

鄒建sql server通用分頁儲存過程

資源概述:csdn社群sql server版大版主鄒建的sql server通用分頁儲存過程。

內容摘錄:

/*--用儲存過程實現的分頁程式

顯示指定表、檢視、查詢結果的第x頁

對於表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法

如果檢視或查詢結果中有主鍵,不推薦此方法

--鄒建 2003.09(引用請保留此資訊)--*/

/*--呼叫示例

exec p_show '地區資料'

exec p_show '地區資料',5,3,'地區編號,地區名稱,助記碼','地區編號'

--*/

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[p_show]') and objectproperty(id, n'isprocedure') = 1)

drop procedure [dbo].[p_show]

gocreate proc p_show

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

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

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

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

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

asdeclare @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

創新談 鄒建

在國內,資料庫管理員 英文是 database administrator 簡稱dba 算是乙個新生的,或者從業人員較少的職位。本人從事 dba的職位,也僅僅有 1年的時間。關於 dba應該做些什麼,應該是沒有乙個準確的定義,根據網上的一些資料,結合自己做 dba所經歷的具體事務,個人對 dba的職...

通用分頁儲存過程 sqlserver

獲取指定頁的資料 create procedure sppagination tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...

sqlserver 通用分頁儲存過程

示例一create procedure commonpagination columns varchar 500 要顯示的列名,用逗號隔開 tablename varchar 100 要查詢的表名 ordercolumnname varchar 100 排序的列名 order varchar 50 ...