通用分頁(yè)存儲(chǔ)過(guò)程,源碼共享,大家共同完善
select '' as CheckBox, A.TargetID, A.TargetPeriod, Convert(varchar(10), B.BeginDate, 120) as BeginDate,
Convert(varchar(10), B.EndDate, 120) as EndDate, C.SalesCode, C.SalesName, D.CatalogCode, D.CatalogName,
E.OrgID, E.OrgName, F.OrgID as BranchOrgID, F.OrgCode as BranchOrgCode, F.OrgName as BranchOrgName,
A.Amount, '' as DetailButton
from ChlSalesTarget as A
left outer join ChlSalesTargetPeriod as B on A.TargetPeriod=B.TargetPeriod
left outer join ChlSales as C on A.Sales=C.SalesCode
left outer join ChlItemCatalog as D on A.ItemCatalog=D.CatalogCode
left outer join ChlOrg as E on A.OrgID=E.OrgID
left outer join ChlOrg as F on C.BranchOrgID=F.OrgID
where A.TargetPeriod >='200607' and A.TargetPeriod <='200608' and F.OrgCode like '%123%' and E.OrgCode like '%123%'
order by A.TargetPeriod desc,C.SalesName,D.CatalogName上面這句SQL里面有一些特殊情況,比如使用了Convert函數(shù),而且沒有主鍵,有多表連接,有表別名,字段別名等等,這些情況處理起來(lái)可能比較棘手,當(dāng)然,其中的“'' as CheckBox”是我系統(tǒng)當(dāng)中的特例情況,用來(lái)做一些處理的。
我這里提供一個(gè)自己開發(fā)的通用分頁(yè)存儲(chǔ)過(guò)程,有什么好的建議和意見,大家請(qǐng)不吝指教。代碼如下:
通用分頁(yè)存儲(chǔ)過(guò)程----Sp_Paging
/**//*
============================================================
功能: 通用分頁(yè)存儲(chǔ)過(guò)程
參數(shù):
@PK varchar(50), 主鍵,用來(lái)排序的單一字段,空的話,表示沒有主鍵,存儲(chǔ)過(guò)程將自動(dòng)創(chuàng)建標(biāo)識(shí)列主鍵
@Fields varchar(500), 要顯示的字段列表(格式如:ID,Code,Name)
@Tables varchar(1000), 要使用的表集合(Org)
@Where varchar(500), 查詢條件(Code like '100')
@OrderBy varchar(100), 排序條件(支持多個(gè)排序字段,如:ID,Code desc,Name desc)
@PageIndex int, 當(dāng)前要顯示的頁(yè)的頁(yè)索引,索引從1開始,無(wú)記錄時(shí)為0。
@PageSize int, 頁(yè)大小
創(chuàng)建者:Hollis Yao
創(chuàng)建日期:2006-08-06
備注:
============================================================
*/
Create PROCEDURE [dbo].[Sp_Paging]
@PK varchar(50)='',
@Fields varchar(500),
@Tables varchar(1000),
@Where varchar(500)='',
@OrderBy varchar(100),
@PageIndex int,
@PageSize int
AS
--替換單引號(hào),避免構(gòu)造SQL出錯(cuò)
set @Fields = replace(@Fields, '''', '''''')
--要執(zhí)行的SQL,切分為幾個(gè)字符串,避免出現(xiàn)長(zhǎng)度超過(guò)4k時(shí)的問(wèn)題
declare @SQL1 varchar(4000)
declare @SQL2 varchar(4000)
set @SQL1 = ''
set @SQL2 = ''
if @Where is not null and len(ltrim(rtrim(@Where))) > 0
set @Where = ' where ' + @Where
else
set @Where = ' where 1=1'
set @SQL1 = @SQL1 + ' declare @TotalCount int' --聲明一個(gè)變量,總記錄數(shù)
set @SQL1 = @SQL1 + ' declare @PageCount int' --聲明一個(gè)變量,總頁(yè)數(shù)
set @SQL1 = @SQL1 + ' declare @PageIndex int' --聲明一個(gè)變量,頁(yè)索引
set @SQL1 = @SQL1 + ' declare @StartRow int' --聲明一個(gè)變量,當(dāng)前頁(yè)第一條記錄的索引
set @SQL1 = @SQL1 + ' select @TotalCount=count(*) from ' + @Tables + @Where --獲取總記錄數(shù)
set @SQL1 = @SQL1 + ' if @PageCount <= 0 begin' --如果記錄數(shù)為0,直接輸出空的結(jié)果集
set @SQL1 = @SQL1 + ' select ' + @Fields + ' from ' + @Tables + ' where 1<>1'
set @SQL1 = @SQL1 + ' select 0 as PageIndex,0 as PageCount,' + convert(varchar, @PageSize) + ' as PageSize,0 as TotalCount'
set @SQL1 = @SQL1 + ' return end'
set @SQL1 = @SQL1 + ' set @PageCount=(@TotalCount+' + convert(varchar, @PageSize) + '-1)/' + convert(varchar, @PageSize) --獲取總頁(yè)數(shù)
set @SQL1 = @SQL1 + ' set @PageIndex=' + convert(varchar, @PageIndex) --設(shè)置正確的頁(yè)索引
set @SQL1 = @SQL1 + ' if @PageIndex<0 set @PageIndex=1'
set @SQL1 = @SQL1 + ' if @PageIndex>@PageCount and @PageCount>0 set @PageIndex=@PageCount'
set @SQL1 = @SQL1 + ' set @StartRow=(@PageIndex-1)*' + convert(varchar, @PageSize) + '+1'
if (charindex(',', @OrderBy)=0 and charindex(@PK, @OrderBy)>0)
begin
--****************************************************************************
--****************不需要?jiǎng)?chuàng)建主鍵********************************************
--****************************************************************************
declare @SortDirection varchar(10) --排序方向,>=:升序,<=:倒序
set @SortDirection = '>='
if charindex('desc', @OrderBy) > 0
set @SortDirection = '<='
set @SQL2 = @SQL2 + ' declare @Sort varchar(100)' --聲明一個(gè)變量,用來(lái)記錄當(dāng)前頁(yè)第一條記錄的排序字段值
set @SQL2 = @SQL2 + ' set rowcount @StartRow' --設(shè)置返回記錄數(shù)截止到當(dāng)前頁(yè)的第一條
set @SQL2 = @SQL2 + ' select @Sort=' + @PK + ' from ' + @Tables + @Where + ' order by ' + @OrderBy --獲取當(dāng)前頁(yè)第一個(gè)排序字段值
set @SQL2 = @SQL2 + ' set rowcount ' + convert(varchar, @PageSize) --設(shè)置返回記錄數(shù)為頁(yè)大小
set @Where = @Where + ' and ' + @PK + @SortDirection + '@Sort'
set @SQL2 = @SQL2 + ' select ' + @Fields + ' from ' + @Tables + @Where + ' order by ' + @OrderBy --輸出最終顯示結(jié)果
end
else
begin
--****************************************************************************
--*************需要?jiǎng)?chuàng)建自增長(zhǎng)主鍵******************************************
--****************************************************************************
set @SQL2 = @SQL2 + ' declare @EndRow int'
set @SQL2 = @SQL2 + ' set @EndRow=@PageIndex*' + convert(varchar, @PageSize)
set @SQL2 = @SQL2 + ' set rowcount @EndRow'
set @SQL2 = @SQL2 + ' declare @PKBegin int' --聲明一個(gè)變量,開始索引
set @SQL2 = @SQL2 + ' declare @PKEnd int' --聲明一個(gè)變量,結(jié)束索引
set @SQL2 = @SQL2 + ' set @PKBegin=@StartRow'
set @SQL2 = @SQL2 + ' set @PKEnd=@EndRow'
--****************************************************************************
--************對(duì)特殊字段進(jìn)行轉(zhuǎn)換,以便可以插入到臨時(shí)表******************
--****************************************************************************
declare @TempFields varchar(500)
set @TempFields=@Fields
set @TempFields = replace(@TempFields, ''''' as CheckBox', '')
set @TempFields = replace(@TempFields, ''''' as DetailButton', '')
set @TempFields = replace(@TempFields, ''''' as Radio', '')
set @TempFields = LTRIM(RTRIM(@TempFields))
if left(@TempFields,1)=',' --去除最左邊的逗號(hào)
set @TempFields = substring(@TempFields, 2, len(@TempFields))
if right(@TempFields,1)=',' --去除最右邊的逗號(hào)
set @TempFields = substring(@TempFields, 1, len(@TempFields)-1)
set @SQL2 = @SQL2 + ' select identity(int,1,1) as PK,' + @TempFields + ' into #tb from ' + @Tables + @Where + ' order by ' + @OrderBy
--****************************************************************************
--********去除字段的表名前綴,當(dāng)有字段有別名時(shí),只保留字段別名*********
--****************************************************************************
declare @TotalFields varchar(500)
declare @tmp varchar(50)
declare @i int
declare @j int
declare @iLeft int --左括號(hào)的個(gè)數(shù)
declare @iRight int --右括號(hào)的個(gè)數(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
--找不到逗號(hào)分割,即表示只剩下最后一個(gè)字段
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)有字段有別名時(shí),只保留字段別名*********
--帶括號(hào)的情況要單獨(dú)處理,如Convert(varchar(10), B.EndDate, 120) as EndDate
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)括號(hào)恰好組隊(duì)的時(shí)候,才能進(jìn)行字段別名的處理
if (@iLeft = @iRight)
begin
set @iLeft = 0
set @iRight = 0
--不對(duì)這幾個(gè)特殊字段作處理:CheckBox、DetailButton、Radio
if (charindex('CheckBox', @tmp) = 0 and charindex('DetailButton', @tmp) = 0 and charindex('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 #tb where PK between @PKBegin and @PKEnd order by PK' --輸出最終顯示結(jié)果
set @SQL2 = @SQL2 + ' drop table #tb'
end
--輸出“PageIndex(頁(yè)索引)、PageCount(頁(yè)數(shù))、PageSize(頁(yè)大小)、TotalCount(總記錄數(shù))”
set @SQL2 = @SQL2 + ' select @PageIndex as PageIndex,@PageCount as PageCount,'
+ convert(varchar, @PageSize) + ' as PageSize,@TotalCount as TotalCount'
--print @SQL1 + @SQL2
exec(@SQL1 + @SQL2)
如果使用這個(gè)通用分頁(yè)存儲(chǔ)過(guò)程的話,那么調(diào)用方法如下:
使用通用分頁(yè)存儲(chǔ)過(guò)程進(jìn)行分頁(yè)
/**//*
============================================================
功能: 獲取銷售目標(biāo),根據(jù)條件
參數(shù):
@UserType int,
@OrgID varchar(500),
@TargetPeriodBegin nvarchar(50),
@TargetPeriodEnd nvarchar(50),
@BranchOrgCode nvarchar(50),
@BranchOrgName nvarchar(50),
@OrgCode nvarchar(50),
@OrgName nvarchar(50),
@SalesCode nvarchar(50),
@SalesName nvarchar(50),
@CatalogCode nvarchar(50),
@CatalogName nvarchar(50),
@PageIndex int, 當(dāng)前要顯示的頁(yè)的頁(yè)索引,索引從1開始,無(wú)記錄時(shí)為0。
@PageSize int, 頁(yè)大小
創(chuàng)建者:Hollis Yao
創(chuàng)建日期:2006-08-11
備注:
============================================================
*/
Create PROCEDURE [dbo].[GetSalesTargetList]
@UserType int,
@OrgID nvarchar(500),
@TargetPeriodBegin nvarchar(50),
@TargetPeriodEnd nvarchar(50),
@BranchOrgCode nvarchar(50),
@BranchOrgName nvarchar(50),
@OrgCode nvarchar(50),
@OrgName nvarchar(50),
@SalesCode nvarchar(50),
@SalesName nvarchar(50),
@CatalogCode nvarchar(50),
@CatalogName nvarchar(50),
@PageIndex int,
@PageSize int
AS
declare @Condition nvarchar(2000)
set @Condition = ''
if (@UserType<>1)
set @Condition = @Condition + ' and A.OrgID in (' + @OrgID + ')'
if (len(@TargetPeriodBegin)>0)
set @Condition = @Condition + ' and A.TargetPeriod >=''' + @TargetPeriodBegin + ''''
if (len(@TargetPeriodEnd)>0)
set @Condition = @Condition + ' and A.TargetPeriod <=''' + @TargetPeriodEnd + ''''
if (len(@BranchOrgCode)>0)
set @Condition = @Condition + ' and F.OrgCode like ''%' + @BranchOrgCode + '%'''
if (len(@BranchOrgName)>0)
set @Condition = @Condition + ' and F.OrgName like ''%' + @BranchOrgName + '%'''
if (len(@OrgCode)>0)
set @Condition = @Condition + ' and E.OrgCode like ''%' + @OrgCode + '%'''
if (len(@OrgName)>0)
set @Condition = @Condition + ' and E.OrgName like ''%' + @OrgName + '%'''
if (len(@SalesCode)>0)
set @Condition = @Condition + ' and C.SalesCode like ''%' + @SalesCode + '%'''
if (len(@SalesName)>0)
set @Condition = @Condition + ' and C.SalesName like ''%' + @SalesName + '%'''
if (len(@CatalogCode)>0)
set @Condition = @Condition + ' and D.CatalogCode like ''%' + @CatalogCode + '%'''
if (len(@CatalogName)>0)
set @Condition = @Condition + ' and D.CatalogName like ''%' + @CatalogName + '%'''
if (len(@Condition)>0)
set @Condition = substring(@Condition,5,len(@Condition))
--print @Condition
exec sp_Paging
N'',N''' as CheckBox, A.TargetID, A.TargetPeriod, Convert(varchar(10), B.BeginDate, 120) as BeginDate, Convert(varchar(10), B.EndDate, 120) as EndDate,
C.SalesCode, C.SalesName, D.CatalogCode, D.CatalogName, E.OrgID, E.OrgName, F.OrgID as BranchOrgID, F.OrgCode as BranchOrgCode, F.OrgName as BranchOrgName, A.Amount, '' as DetailButton',
N'ChlSalesTarget as A
left outer join ChlSalesTargetPeriod as B on A.TargetPeriod=B.TargetPeriod
left outer join ChlSales as C on A.Sales=C.SalesCode
left outer join ChlItemCatalog as D on A.ItemCatalog=D.CatalogCode
left outer join ChlOrg as E on A.OrgID=E.OrgID
left outer join ChlOrg as F on C.BranchOrgID=F.OrgID',
@Condition,
N'A.TargetPeriod desc,C.SalesName,D.CatalogName',
@PageIndex, @PageSize
相關(guān)文章
SQL Server 數(shù)據(jù)頁(yè)緩沖區(qū)的內(nèi)存瓶頸分析
數(shù)據(jù)頁(yè)緩存是SQL Server的內(nèi)存使用主要的方面,也是占用量最大的部分。在一個(gè)穩(wěn)定的DB Server上,這部分內(nèi)存使用會(huì)相對(duì)較穩(wěn)定2012-08-08sql server的一個(gè)有趣的bit位運(yùn)算分享
sql server中沒有bool類型,而是用bit類型來(lái)表示bool值,估計(jì)是為了節(jié)省存儲(chǔ)空間,下面為大家介紹下這個(gè)有趣的bit位運(yùn)算,感興趣的朋友可以參考下2013-09-09SQL?Server使用T-SQL進(jìn)階之公用表表達(dá)式(CTE)
這篇文章介紹了SQL?Server中T-SQL的公用表表達(dá)式(CTE),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
時(shí)候當(dāng)系統(tǒng)運(yùn)行時(shí)間比較長(zhǎng)的時(shí)候,我們把備份的數(shù)據(jù)庫(kù)還原的時(shí)候發(fā)現(xiàn),數(shù)據(jù)庫(kù)中數(shù)據(jù)文件和日志文件變的好大,特別是日志文件?,F(xiàn)在給大家介紹如何清理SQLServer數(shù)據(jù)庫(kù)日志2013-05-05sql server字符串非空判斷實(shí)現(xiàn)方法
在使用sql server過(guò)程中會(huì)遇到非空判斷,本文將詳細(xì)介紹sql server字符串非空判斷實(shí)現(xiàn)方法,需要了解的朋友可以參考下2012-12-12深入SQL SERVER合并相關(guān)操作Union,Except,Intersect的詳解
本篇文章是對(duì)SQL SERVER合并相關(guān)操作Union,Except,Intersect進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06SQLSERVER聚集索引和主鍵(Primary Key)的誤區(qū)認(rèn)識(shí)
很多人會(huì)把Primary Key和聚集索引搞混起來(lái),或者認(rèn)為這是同一個(gè)東西。這個(gè)概念是非常錯(cuò)誤的,本文將帶你理清思路,感興趣的你可不要錯(cuò)過(guò)了哈,或許本文對(duì)你有所幫助2013-02-02如何創(chuàng)建SQL Server 2000故障轉(zhuǎn)移群集
如何創(chuàng)建SQL Server 2000故障轉(zhuǎn)移群集...2007-01-01SQL Server 2016 CTP2.2安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了SQL Server 2016 CTP2.2安裝配置方法圖文教程 ,感興趣的小伙伴們可以參考一下2016-07-07