分頁(yè) SQLServer存儲(chǔ)過(guò)程
發(fā)布日期:2022-02-05 10:32 | 文章來(lái)源:腳本之家
顯示指定表、視圖、查詢結(jié)果的第X頁(yè)
對(duì)于表中主鍵或標(biāo)識(shí)列的情況,直接從原表取數(shù)查詢,其它情況使用臨時(shí)表的方法
如果視圖或查詢結(jié)果中有主鍵,不推薦此方法
--鄒建2003.09--*/
/*--調(diào)用示例
execp_show'地區(qū)資料'
execp_show'地區(qū)資料',5,3,'地區(qū)編號(hào),地區(qū)名稱,助記碼','地區(qū)編號(hào)'
--*/
/*
因?yàn)橐櫦巴ㄓ眯?所以對(duì)帶排序的查詢語(yǔ)句有一定要求.如果先排序,再出結(jié)果.就是:
execp_show'selecttop100percent*from地區(qū)資料orderby地區(qū)名稱',5,3,'地區(qū)編號(hào),地區(qū)名稱,助記碼','地區(qū)名稱'
--查詢語(yǔ)句加上:top100percent//top時(shí)
*/
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_show]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_show]
GO
CreateProcp_show
@QueryStrnvarchar(4000),--表名、視圖名、查詢語(yǔ)句
@PageSizeint=10,--每頁(yè)的大小(行數(shù))
@PageCurrentint=1,--要顯示的頁(yè)
@FdShownvarchar(4000)='',--要顯示的字段列表,如果查詢結(jié)果有標(biāo)識(shí)字段,需要指定此值,且不包含標(biāo)識(shí)字段
@FdOrdernvarchar(1000)=''--排序字段列表
as
declare@FdNamenvarchar(250)--表中的主鍵或表、臨時(shí)表中的標(biāo)識(shí)列名
,@Id1varchar(20),@Id2varchar(20)--開(kāi)始和結(jié)束的記錄號(hào)
,@Obj_IDint--對(duì)象ID
--表中有復(fù)合主鍵的處理
declare@strfdnvarchar(2000)--復(fù)合主鍵列表
,@strjoinnvarchar(4000)--連接字段
,@strwherenvarchar(2000)--查詢條件 select@Obj_ID=object_id(@QueryStr)
,@FdShow=caseisnull(@FdShow,'')when''then'*'else''+@FdShowend
,@FdOrder=caseisnull(@FdOrder,'')when''then''else'orderby'+@FdOrderend
,@QueryStr=casewhen@Obj_IDisnotnullthen''+@QueryStrelse'('+@QueryStr+')a'end
--如果顯示第一頁(yè),可以直接用top來(lái)完成
if@PageCurrent=1
begin
select@Id1=cast(@PageSizeasvarchar(20))
exec('selecttop'+@Id1+@FdShow+'from'+@QueryStr+@FdOrder)
return
end
--如果是表,則檢查表中是否有標(biāo)識(shí)更或主鍵
if@Obj_IDisnotnullandobjectproperty(@Obj_ID,'IsTable')=1
begin
select@Id1=cast(@PageSizeasvarchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSizeasvarchar(20))
select@FdName=namefromsyscolumnswhereid=@Obj_IDandstatus=0x80
if@@rowcount=0--如果表中無(wú)標(biāo)識(shí)列,則檢查表中是否有主鍵
begin
ifnotexists(select1fromsysobjectswhereparent_obj=@Obj_IDandxtype='PK')
gotolbusetemp--如果表中無(wú)主鍵,則用臨時(shí)表處理
select@FdName=namefromsyscolumnswhereid=@Obj_IDandcolidin(
selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin(
selectindidfromsysindexeswhere@Obj_ID=idandnamein(
selectnamefromsysobjectswherextype='PK'andparent_obj=@Obj_ID
)))
if@@rowcount>1--檢查表中的主鍵是否為復(fù)合主鍵
begin
select@strfd='',@strjoin='',@strwhere=''
select@strfd=@strfd+',['+name+']'
,@strjoin=@strjoin+'anda.['+name+']=b.['+name+']'
,@strwhere=@strwhere+'andb.['+name+']isnull'
fromsyscolumnswhereid=@Obj_IDandcolidin(
selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin(
selectindidfromsysindexeswhere@Obj_ID=idandnamein(
selectnamefromsysobjectswherextype='PK'andparent_obj=@Obj_ID
)))
select@strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
gotolbusepk
end
end
end
else
gotolbusetemp
/*--使用標(biāo)識(shí)列或主鍵為單一字段的處理方法--*/
lbuseidentity:
exec('selecttop'+@Id1+@FdShow+'from'+@QueryStr
+'where'+@FdName+'notin(selecttop'
+@Id2+''+@FdName+'from'+@QueryStr+@FdOrder
+')'+@FdOrder
)
return
/*--表中有復(fù)合主鍵的處理方法--*/
lbusepk:
exec('select'+@FdShow+'from(selecttop'+@Id1+'a.*from
(selecttop100percent*from'+@QueryStr+@FdOrder+')a
leftjoin(selecttop'+@Id2+''+@strfd+'
from'+@QueryStr+@FdOrder+')bon'+@strjoin+'
where'+@strwhere+')a'
)
return
/*--用臨時(shí)表處理的方法--*/
lbusetemp:
select@FdName='[ID_'+cast(newid()asvarchar(40))+']'
,@Id1=cast(@PageSize*(@PageCurrent-1)asvarchar(20))
,@Id2=cast(@PageSize*@PageCurrent-1asvarchar(20))
exec('select'+@FdName+'=identity(int,0,1),'+@FdShow+'
into#tbfrom'+@QueryStr+@FdOrder+'
select'+@FdShow+'from#tbwhere'+@FdName+'between'
+@Id1+'and'+@Id2
)
GO
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
相關(guān)文章