一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 分頁 SQLServer存儲過程

分頁 SQLServer存儲過程

2019-10-21 14:51mssql教程網 Sql Server

分頁 SQLServer存儲過程,對于表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法。

/*--用存儲過程實現的分頁程序 
顯示指定表、視圖、查詢結果的第X頁 
對于表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法 
如果視圖或查詢結果中有主鍵,不推薦此方法 
--鄒建 2003.09--*/ 
/*--調用示例 
exec p_show '地區資料' 
exec p_show '地區資料',5,3,'地區編號,地區名稱,助記碼','地區編號' 
--*/ 
/* 
因為要顧及通用性,所以對帶排序的查詢語句有一定要求.如果先排序,再出結果.就是: 
exec p_show 'select top 100 percent * from 地區資料 order by 地區名稱',5,3,'地區編號,地區名稱,助記碼','地區名稱' 
--查詢語句加上:top 100 percent //top時 
*/ 
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] 
GO 
Create Proc p_show 
@QueryStr nvarchar(4000), --表名、視圖名、查詢語句 
@PageSize int=10, --每頁的大小(行數) 
@PageCurrent int=1, --要顯示的頁 
@FdShow nvarchar (4000)='', --要顯示的字段列表,如果查詢結果有標識字段,需要指定此值,且不包含標識字段 
@FdOrder nvarchar (1000)='' --排序字段列表 
as 
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 
end 
end 
end 
else 
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 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 公交车上插入 | 欧美2区 | 91精品国产91久久久久 | 久久综合狠狠综合狠狠 | meyd–456佐山爱在线播放 | 久久精品热只有精品 | а天堂中文最新版在线 | 操bb视频| 国产精品永久免费自在线观看 | 不知火舞被c视频在线播放 不卡一区二区三区卡 | 黑人日白人 | 国产手机在线观看 | 日韩欧美亚洲每日更新网 | 白丝女仆被啪到深夜漫画 | 国产成人a∨麻豆精品 | jzzjlzz亚洲乱熟在线播放 | 日韩精品成人 | 亚洲色大成网站www久久九九 | 亚洲看片lutube在线入口 | 日韩大片免费观看 | 92精品国产成人观看免费 | 东京干福利 | bnb998八度免费影院丫意浓 | 日韩天堂网 | 贰佰麻豆剧果冻传媒一二三区 | 香蕉成人国产精品免费看网站 | 国产卡一卡二卡3卡乱码免费 | 国产精品日本一区二区不卡视频 | 午夜DY888国产精品影院 | 国内激情自拍 | 免费我看视频在线观看 | 夫承子液by免费阅读 | 被调教的校花 | 精品区2区3区4区产品乱码9 | 国内免费高清视频在线观看 | 高贵女王调奴vk | 国产精品久久现线拍久青草 | 99视频精品全部免费观看 | 午夜办公室 | 动态图啪啪120秒免费看 | 亚洲午夜小视频 |