通用分頁存儲過程,源碼共享,大家共同完善
發(fā)布日期:2022-02-03 18:44 | 文章來源:gibhub
select''asCheckBox,A.TargetID,A.TargetPeriod,Convert(varchar(10),B.BeginDate,120)asBeginDate,
Convert(varchar(10),B.EndDate,120)asEndDate,C.SalesCode,C.SalesName,D.CatalogCode,D.CatalogName,
E.OrgID,E.OrgName,F.OrgIDasBranchOrgID,F.OrgCodeasBranchOrgCode,F.OrgNameasBranchOrgName,
A.Amount,''asDetailButton
fromChlSalesTargetasA
leftouterjoinChlSalesTargetPeriodasBonA.TargetPeriod=B.TargetPeriod
leftouterjoinChlSalesasConA.Sales=C.SalesCode
leftouterjoinChlItemCatalogasDonA.ItemCatalog=D.CatalogCode
leftouterjoinChlOrgasEonA.OrgID=E.OrgID
leftouterjoinChlOrgasFonC.BranchOrgID=F.OrgID
whereA.TargetPeriod>='200607'andA.TargetPeriod<='200608'andF.OrgCodelike'%123%'andE.OrgCodelike'%123%'
orderbyA.TargetPerioddesc,C.SalesName,D.CatalogName上面這句SQL里面有一些特殊情況,比如使用了Convert函數(shù),而且沒有主鍵,有多表連接,有表別名,字段別名等等,這些情況處理起來可能比較棘手,當(dāng)然,其中的“''asCheckBox”是我系統(tǒng)當(dāng)中的特例情況,用來做一些處理的。
我這里提供一個自己開發(fā)的通用分頁存儲過程,有什么好的建議和意見,大家請不吝指教。代碼如下:
通用分頁存儲過程----Sp_Paging
/**//*
============================================================
功能:通用分頁存儲過程
參數(shù):
@PKvarchar(50),主鍵,用來排序的單一字段,空的話,表示沒有主鍵,存儲過程將自動創(chuàng)建標(biāo)識列主鍵
@Fieldsvarchar(500),要顯示的字段列表(格式如:ID,Code,Name)
@Tablesvarchar(1000),要使用的表集合(Org)
@Wherevarchar(500),查詢條件(Codelike'100')
@OrderByvarchar(100),排序條件(支持多個排序字段,如:ID,Codedesc,Namedesc)
@PageIndexint,當(dāng)前要顯示的頁的頁索引,索引從1開始,無記錄時為0。
@PageSizeint,頁大小
創(chuàng)建者:HollisYao
創(chuàng)建日期:2006-08-06
備注:
============================================================
*/
CreatePROCEDURE[dbo].[Sp_Paging]
@PKvarchar(50)='',
@Fieldsvarchar(500),
@Tablesvarchar(1000),
@Wherevarchar(500)='',
@OrderByvarchar(100),
@PageIndexint,
@PageSizeint
AS
--替換單引號,避免構(gòu)造SQL出錯
set@Fields=replace(@Fields,'''','''''') --要執(zhí)行的SQL,切分為幾個字符串,避免出現(xiàn)長度超過4k時的問題
declare@SQL1varchar(4000)
declare@SQL2varchar(4000) set@SQL1=''
set@SQL2=''
if@Whereisnotnullandlen(ltrim(rtrim(@Where)))>0
set@Where='where'+@Where
else
set@Where='where1=1' set@SQL1=@SQL1+'declare@TotalCountint'--聲明一個變量,總記錄數(shù)
set@SQL1=@SQL1+'declare@PageCountint'--聲明一個變量,總頁數(shù)
set@SQL1=@SQL1+'declare@PageIndexint'--聲明一個變量,頁索引
set@SQL1=@SQL1+'declare@StartRowint'--聲明一個變量,當(dāng)前頁第一條記錄的索引 set@SQL1=@SQL1+'select@TotalCount=count(*)from'+@Tables+@Where--獲取總記錄數(shù)
set@SQL1=@SQL1+'if@PageCount<=0begin'--如果記錄數(shù)為0,直接輸出空的結(jié)果集
set@SQL1=@SQL1+'select'+@Fields+'from'+@Tables+'where1<>1'
set@SQL1=@SQL1+'select0asPageIndex,0asPageCount,'+convert(varchar,@PageSize)+'asPageSize,0asTotalCount'
set@SQL1=@SQL1+'returnend' set@SQL1=@SQL1+'set@PageCount=(@TotalCount+'+convert(varchar,@PageSize)+'-1)/'+convert(varchar,@PageSize)--獲取總頁數(shù)
set@SQL1=@SQL1+'set@PageIndex='+convert(varchar,@PageIndex)--設(shè)置正確的頁索引
set@SQL1=@SQL1+'if@PageIndex<0set@PageIndex=1'
set@SQL1=@SQL1+'if@PageIndex>@PageCountand@PageCount>0set@PageIndex=@PageCount'
set@SQL1=@SQL1+'set@StartRow=(@PageIndex-1)*'+convert(varchar,@PageSize)+'+1' if(charindex(',',@OrderBy)=0andcharindex(@PK,@OrderBy)>0)
begin
--****************************************************************************
--****************不需要創(chuàng)建主鍵********************************************
--****************************************************************************
declare@SortDirectionvarchar(10)--排序方向,>=:升序,<=:倒序
set@SortDirection='>='
ifcharindex('desc',@OrderBy)>0
set@SortDirection='<='
set@SQL2=@SQL2+'declare@Sortvarchar(100)'--聲明一個變量,用來記錄當(dāng)前頁第一條記錄的排序字段值
set@SQL2=@SQL2+'setrowcount@StartRow'--設(shè)置返回記錄數(shù)截止到當(dāng)前頁的第一條
set@SQL2=@SQL2+'select@Sort='+@PK+'from'+@Tables+@Where+'orderby'+@OrderBy--獲取當(dāng)前頁第一個排序字段值
set@SQL2=@SQL2+'setrowcount'+convert(varchar,@PageSize)--設(shè)置返回記錄數(shù)為頁大小
set@Where=@Where+'and'+@PK+@SortDirection+'@Sort'
set@SQL2=@SQL2+'select'+@Fields+'from'+@Tables+@Where+'orderby'+@OrderBy--輸出最終顯示結(jié)果
end
else
begin
--****************************************************************************
--*************需要創(chuàng)建自增長主鍵******************************************
--****************************************************************************
set@SQL2=@SQL2+'declare@EndRowint'
set@SQL2=@SQL2+'set@EndRow=@PageIndex*'+convert(varchar,@PageSize)
set@SQL2=@SQL2+'setrowcount@EndRow'
set@SQL2=@SQL2+'declare@PKBeginint'--聲明一個變量,開始索引
set@SQL2=@SQL2+'declare@PKEndint'--聲明一個變量,結(jié)束索引
set@SQL2=@SQL2+'set@PKBegin=@StartRow'
set@SQL2=@SQL2+'set@PKEnd=@EndRow'
--****************************************************************************
--************對特殊字段進(jìn)行轉(zhuǎn)換,以便可以插入到臨時表******************
--****************************************************************************
declare@TempFieldsvarchar(500)
set@TempFields=@Fields
set@TempFields=replace(@TempFields,'''''asCheckBox','')
set@TempFields=replace(@TempFields,'''''asDetailButton','')
set@TempFields=replace(@TempFields,'''''asRadio','')
set@TempFields=LTRIM(RTRIM(@TempFields))
ifleft(@TempFields,1)=','--去除最左邊的逗號
set@TempFields=substring(@TempFields,2,len(@TempFields))
ifright(@TempFields,1)=','--去除最右邊的逗號
set@TempFields=substring(@TempFields,1,len(@TempFields)-1) set@SQL2=@SQL2+'selectidentity(int,1,1)asPK,'+@TempFields+'into#tbfrom'+@Tables+@Where+'orderby'+@OrderBy
--****************************************************************************
--********去除字段的表名前綴,當(dāng)有字段有別名時,只保留字段別名*********
--****************************************************************************
declare@TotalFieldsvarchar(500)
declare@tmpvarchar(50)
declare@iint
declare@jint
declare@iLeftint--左括號的個數(shù)
declare@iRightint--右括號的個數(shù)
set@i=0
set@j=0
set@iLeft=0
set@iRight=0
set@tmp=''
set@TotalFields='' while(len(@Fields)>0)
begin
set@i=charindex(',',@Fields) --去除字段的表名前綴
if(@i=0)
begin
--找不到逗號分割,即表示只剩下最后一個字段
set@tmp=@Fields
end
else
begin
set@tmp=substring(@Fields,1,@i)
end
set@j=charindex('.',@tmp)
if(@j>0)
set@tmp=substring(@tmp,@j+1,len(@tmp))
--*******當(dāng)有字段有別名時,只保留字段別名********* --帶括號的情況要單獨(dú)處理,如Convert(varchar(10),B.EndDate,120)asEndDate
while(charindex('(',@tmp)>0)
begin
set@iLeft=@iLeft+1
set@tmp=substring(@tmp,charindex('(',@tmp)+1,Len(@tmp))
end
while(charindex(')',@tmp)>0)
begin
set@iRight=@iRight+1
set@tmp=substring(@tmp,charindex(')',@tmp)+1,Len(@tmp))
end --當(dāng)括號恰好組隊(duì)的時候,才能進(jìn)行字段別名的處理
if(@iLeft=@iRight)
begin
set@iLeft=0
set@iRight=0
--不對這幾個特殊字段作處理:CheckBox、DetailButton、Radio
if(charindex('CheckBox',@tmp)=0andcharindex('DetailButton',@tmp)=0andcharindex('Radio',@tmp)=0)
begin
--判斷是否有別名
if(charindex('as',@tmp)>0)--別名的第一種寫法,帶'as'的格式
begin
set@tmp=substring(@tmp,charindex('as',@tmp)+2,len(@tmp))
end
else
begin
if(charindex('',@tmp)>0)--別名的第二種寫法,帶空格("")的格式
begin
while(charindex('',@tmp)>0)
begin
set@tmp=substring(@tmp,charindex('',@tmp)+1,len(@tmp))
end
end
end
end
set@TotalFields=@TotalFields+@tmp
end
if(@i=0)
set@Fields=''
else
set@Fields=substring(@Fields,@i+1,len(@Fields)) end
--print@TotalFields set@SQL2=@SQL2+'select'+@TotalFields+'from#tbwherePKbetween@PKBeginand@PKEndorderbyPK'--輸出最終顯示結(jié)果
set@SQL2=@SQL2+'droptable#tb'
end --輸出“PageIndex(頁索引)、PageCount(頁數(shù))、PageSize(頁大小)、TotalCount(總記錄數(shù))”
set@SQL2=@SQL2+'select@PageIndexasPageIndex,@PageCountasPageCount,'
+convert(varchar,@PageSize)+'asPageSize,@TotalCountasTotalCount' --print@SQL1+@SQL2
exec(@SQL1+@SQL2)
如果使用這個通用分頁存儲過程的話,那么調(diào)用方法如下:
使用通用分頁存儲過程進(jìn)行分頁
/**//*
============================================================
功能:獲取銷售目標(biāo),根據(jù)條件
參數(shù):
@UserTypeint,
@OrgIDvarchar(500),
@TargetPeriodBeginnvarchar(50),
@TargetPeriodEndnvarchar(50),
@BranchOrgCodenvarchar(50),
@BranchOrgNamenvarchar(50),
@OrgCodenvarchar(50),
@OrgNamenvarchar(50),
@SalesCodenvarchar(50),
@SalesNamenvarchar(50),
@CatalogCodenvarchar(50),
@CatalogNamenvarchar(50),
@PageIndexint,當(dāng)前要顯示的頁的頁索引,索引從1開始,無記錄時為0。
@PageSizeint,頁大小
創(chuàng)建者:HollisYao
創(chuàng)建日期:2006-08-11
備注:
============================================================
*/
CreatePROCEDURE[dbo].[GetSalesTargetList]
@UserTypeint,
@OrgIDnvarchar(500),
@TargetPeriodBeginnvarchar(50),
@TargetPeriodEndnvarchar(50),
@BranchOrgCodenvarchar(50),
@BranchOrgNamenvarchar(50),
@OrgCodenvarchar(50),
@OrgNamenvarchar(50),
@SalesCodenvarchar(50),
@SalesNamenvarchar(50),
@CatalogCodenvarchar(50),
@CatalogNamenvarchar(50),
@PageIndexint,
@PageSizeint
AS
declare@Conditionnvarchar(2000)
set@Condition=''
if(@UserType<>1)
set@Condition=@Condition+'andA.OrgIDin('+@OrgID+')'
if(len(@TargetPeriodBegin)>0)
set@Condition=@Condition+'andA.TargetPeriod>='''+@TargetPeriodBegin+''''
if(len(@TargetPeriodEnd)>0)
set@Condition=@Condition+'andA.TargetPeriod<='''+@TargetPeriodEnd+''''
if(len(@BranchOrgCode)>0)
set@Condition=@Condition+'andF.OrgCodelike''%'+@BranchOrgCode+'%'''
if(len(@BranchOrgName)>0)
set@Condition=@Condition+'andF.OrgNamelike''%'+@BranchOrgName+'%'''
if(len(@OrgCode)>0)
set@Condition=@Condition+'andE.OrgCodelike''%'+@OrgCode+'%'''
if(len(@OrgName)>0)
set@Condition=@Condition+'andE.OrgNamelike''%'+@OrgName+'%'''
if(len(@SalesCode)>0)
set@Condition=@Condition+'andC.SalesCodelike''%'+@SalesCode+'%'''
if(len(@SalesName)>0)
set@Condition=@Condition+'andC.SalesNamelike''%'+@SalesName+'%'''
if(len(@CatalogCode)>0)
set@Condition=@Condition+'andD.CatalogCodelike''%'+@CatalogCode+'%'''
if(len(@CatalogName)>0)
set@Condition=@Condition+'andD.CatalogNamelike''%'+@CatalogName+'%'''
if(len(@Condition)>0)
set@Condition=substring(@Condition,5,len(@Condition))
--print@Condition
execsp_Paging
N'',N'''asCheckBox,A.TargetID,A.TargetPeriod,Convert(varchar(10),B.BeginDate,120)asBeginDate,Convert(varchar(10),B.EndDate,120)asEndDate,
C.SalesCode,C.SalesName,D.CatalogCode,D.CatalogName,E.OrgID,E.OrgName,F.OrgIDasBranchOrgID,F.OrgCodeasBranchOrgCode,F.OrgNameasBranchOrgName,A.Amount,''asDetailButton',
N'ChlSalesTargetasA
leftouterjoinChlSalesTargetPeriodasBonA.TargetPeriod=B.TargetPeriod
leftouterjoinChlSalesasConA.Sales=C.SalesCode
leftouterjoinChlItemCatalogasDonA.ItemCatalog=D.CatalogCode
leftouterjoinChlOrgasEonA.OrgID=E.OrgID
leftouterjoinChlOrgasFonC.BranchOrgID=F.OrgID',
@Condition,
N'A.TargetPerioddesc,C.SalesName,D.CatalogName',
@PageIndex,@PageSize
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章
關(guān)注官方微信