亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

通用分頁存儲過程,源碼共享,大家共同完善

2024-08-31 01:00:15
字體:
來源:轉載
供稿:網友
好久沒有上來寫點東西了,今天正好有空,共享一些個人心得,就是關于分頁的存儲過程,這個問題應該是老生重談了,網上的通用存儲過程的類型已經夠多了,但是,好象看到的基本上不能夠滿足一些復雜的SQL語句的分頁(也可能是我不夠見多識廣啊,呵呵),比如下面這句: 
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函數,而且沒有主鍵,有多表連接,有表別名,字段別名等等,這些情況處理起來可能比較棘手,當然,其中的“'' as CheckBox”是我系統當中的特例情況,用來做一些處理的。
    我這里提供一個自己開發的通用分頁存儲過程,有什么好的建議和意見,大家請不吝指教。代碼如下:
通用分頁存儲過程----Sp_Paging
/**//*
============================================================
功能:    通用分頁存儲過程
參數:
    @PK    varchar(50),            主鍵,用來排序的單一字段,空的話,表示沒有主鍵,存儲過程將自動創建標識列主鍵
    @Fields    varchar(500),        要顯示的字段列表(格式如:ID,Code,Name)
    @Tables varchar(1000),        要使用的表集合(Org)
    @Where varchar(500),        查詢條件(Code like '100')
    @OrderBy varchar(100),        排序條件(支持多個排序字段,如:ID,Code desc,Name desc)
    @PageIndex int,                當前要顯示的頁的頁索引,索引從1開始,無記錄時為0。
    @PageSize int,                頁大小
創建者:Hollis Yao
創建日期: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
--替換單引號,避免構造SQL出錯
set @Fields = replace(@Fields, '''', '''''')

--要執行的SQL,切分為幾個字符串,避免出現長度超過4k時的問題
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'    --聲明一個變量,總記錄數
set @SQL1 = @SQL1 + ' declare @PageCount int'    --聲明一個變量,總頁數
set @SQL1 = @SQL1 + ' declare @PageIndex int'    --聲明一個變量,頁索引
set @SQL1 = @SQL1 + ' declare @StartRow int'    --聲明一個變量,當前頁第一條記錄的索引

set @SQL1 = @SQL1 + ' select @TotalCount=count(*) from ' + @Tables + @Where    --獲取總記錄數
set @SQL1 = @SQL1 + ' if @PageCount <= 0 begin'    --如果記錄數為0,直接輸出空的結果集
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)    --獲取總頁數
set @SQL1 = @SQL1 + ' set @PageIndex=' + convert(varchar, @PageIndex)    --設置正確的頁索引
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
    --****************************************************************************
    --****************不需要創建主鍵********************************************
    --****************************************************************************
    declare @SortDirection varchar(10)    --排序方向,>=:升序,<=:倒序
    set @SortDirection = '>='
    if charindex('desc', @OrderBy) > 0
        set @SortDirection = '<='
    set @SQL2 = @SQL2 + ' declare @Sort varchar(100)'    --聲明一個變量,用來記錄當前頁第一條記錄的排序字段值
    set @SQL2 = @SQL2 + ' set rowcount @StartRow'    --設置返回記錄數截止到當前頁的第一條
    set @SQL2 = @SQL2 + ' select @Sort=' + @PK + ' from ' + @Tables + @Where + ' order by ' + @OrderBy    --獲取當前頁第一個排序字段值
    set @SQL2 = @SQL2 + ' set rowcount ' + convert(varchar, @PageSize)    --設置返回記錄數為頁大小
    set @Where = @Where + ' and ' + @PK + @SortDirection + '@Sort'
    set @SQL2 = @SQL2 + ' select ' + @Fields + ' from ' + @Tables + @Where + ' order by ' + @OrderBy    --輸出最終顯示結果
end
else
begin
    --****************************************************************************
    --*************需要創建自增長主鍵******************************************
    --****************************************************************************
    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'    --聲明一個變量,開始索引
    set @SQL2 = @SQL2 + ' declare @PKEnd int'    --聲明一個變量,結束索引
    set @SQL2 = @SQL2 + ' set @PKBegin=@StartRow'
    set @SQL2 = @SQL2 + ' set @PKEnd=@EndRow'
    --****************************************************************************
    --************對特殊字段進行轉換,以便可以插入到臨時表******************
    --****************************************************************************
    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)=','    --去除最左邊的逗號
        set @TempFields = substring(@TempFields, 2, len(@TempFields))
    if right(@TempFields,1)=','    --去除最右邊的逗號
        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
    --****************************************************************************
    --********去除字段的表名前綴,當有字段有別名時,只保留字段別名*********
    --****************************************************************************
    declare @TotalFields varchar(500)
    declare @tmp varchar(50)
    declare @i int
    declare @j int
    declare @iLeft int --左括號的個數
    declare @iRight int --右括號的個數
    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))
        --*******當有字段有別名時,只保留字段別名*********

        --帶括號的情況要單獨處理,如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

        --當括號恰好組隊的時候,才能進行字段別名的處理
        if (@iLeft = @iRight)
        begin
            set @iLeft = 0
            set @iRight = 0
            --不對這幾個特殊字段作處理: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'    --輸出最終顯示結果
    set @SQL2 = @SQL2 + ' drop table #tb'
end

--輸出“PageIndex(頁索引)、PageCount(頁數)、PageSize(頁大小)、TotalCount(總記錄數)”
set @SQL2 = @SQL2 + ' select @PageIndex as PageIndex,@PageCount as PageCount,' 
                + convert(varchar, @PageSize) + ' as PageSize,@TotalCount as TotalCount'

--print @SQL1 + @SQL2
exec(@SQL1 + @SQL2)
如果使用這個通用分頁存儲過程的話,那么調用方法如下:
使用通用分頁存儲過程進行分頁
/**//*
============================================================
功能:    獲取銷售目標,根據條件
參數:
    @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,                當前要顯示的頁的頁索引,索引從1開始,無記錄時為0。
    @PageSize int,                頁大小
創建者:Hollis Yao
創建日期: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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美亚洲一二三区| 久久精品视频一| 精品国产老师黑色丝袜高跟鞋| 久久久午夜视频| 色香阁99久久精品久久久| 高清欧美一区二区三区| 久久亚洲综合国产精品99麻豆精品福利| 久久久久在线观看| 亚洲精品影视在线观看| 欧美性20hd另类| 2023亚洲男人天堂| 亚洲人成网7777777国产| 尤物tv国产一区| 亚洲无限av看| 欧洲成人在线视频| 国产日本欧美一区二区三区在线| 欧美性高跟鞋xxxxhd| 欧美激情videoshd| 久久视频免费观看| 欧美激情视频三区| 欧美一级淫片丝袜脚交| 日韩电影免费观看在线观看| 中文字幕综合在线| 日本精品va在线观看| 国产精品黄视频| 亚洲精品资源在线| 亚洲精品www久久久久久广东| 98视频在线噜噜噜国产| 国产精品观看在线亚洲人成网| 久久精品视频中文字幕| 欧美精品久久久久久久免费观看| 日韩欧美高清在线视频| 欧美电影院免费观看| 亚洲欧美国产精品| 久久精品久久久久久| 欧美日韩福利在线观看| 成人久久18免费网站图片| 亚洲福利视频在线| 色偷偷噜噜噜亚洲男人| 亚洲国产美女久久久久| 国产精品成人一区| 国产精品igao视频| 欧美在线激情网| 爽爽爽爽爽爽爽成人免费观看| 亚洲在线观看视频网站| 亚洲欧美一区二区三区久久| 国产国语videosex另类| 最近2019年日本中文免费字幕| 国产精品激情av电影在线观看| 亚洲第一页自拍| 精品国产91久久久久久| 日韩欧美大尺度| 国产网站欧美日韩免费精品在线观看| 亚洲成色777777女色窝| 高清日韩电视剧大全免费播放在线观看| 在线观看国产成人av片| 日本一区二三区好的精华液| 欧美成人午夜剧场免费观看| 两个人的视频www国产精品| 欧美精品电影在线| 国产精品视频在线观看| 欧美精品日韩www.p站| 亚洲а∨天堂久久精品喷水| 国产成人精品亚洲精品| 亚洲美女免费精品视频在线观看| 黑人狂躁日本妞一区二区三区| 欧美视频在线观看 亚洲欧| 亚洲国产91色在线| 97**国产露脸精品国产| 亚洲伊人久久大香线蕉av| 欧美电影院免费观看| 中文字幕在线视频日韩| 日韩电影免费在线观看| 91久久在线播放| 亚洲美女av在线播放| 在线观看国产精品淫| 日韩一区视频在线| 久久久久久有精品国产| 亚洲欧美日韩视频一区| 伊人久久久久久久久久久| 亚洲精品电影网站| 亚洲国产古装精品网站| 日韩成人激情视频| 国产欧美日韩中文字幕在线| 成人免费视频在线观看超级碰| 国外日韩电影在线观看| 69久久夜色精品国产69乱青草| 国产一区二区黄| 国产亚洲欧美另类中文| 夜夜嗨av一区二区三区四区| 欧美午夜视频一区二区| 日韩精品免费观看| 欧美一区二区三区……| 亚洲视频在线播放| 亚洲国产精品成人精品| 亚洲精品按摩视频| 亚洲福利视频网站| 日韩中文在线视频| 国产一区欧美二区三区| 免费不卡在线观看av| 国产欧美精品va在线观看| 97香蕉久久超级碰碰高清版| 成人精品福利视频| 国产精品第一页在线| 精品视频久久久| 久久中文精品视频| 国产精品香蕉国产| 国产玖玖精品视频| 91免费福利视频| 亚洲欧美精品一区二区| 成人网在线视频| 亚洲三级av在线| 91sao在线观看国产| 成人欧美一区二区三区黑人孕妇| 成人久久一区二区三区| 久久久久久久影视| 欧美激情一区二区三区高清视频| 日韩av电影手机在线| 久久国产精品视频| 久久午夜a级毛片| 一区二区三区视频观看| 国产精品夜间视频香蕉| 国产精品精品一区二区三区午夜版| 欧美大片在线看| 中文字幕av一区中文字幕天堂| 国产一区香蕉久久| 欧美乱人伦中文字幕在线| 亚洲在线观看视频| 日韩精品免费在线视频观看| 国产狼人综合免费视频| 国产视频久久久久| 亚洲自拍偷拍色图| 亚洲人成网站在线播| 日韩精品在线免费观看视频| 久久影院免费观看| 亚洲电影免费观看| 国产精品∨欧美精品v日韩精品| 九九久久综合网站| 国产精品欧美风情| 精品免费在线观看| 少妇高潮久久久久久潘金莲| 欧美丰满少妇xxxxx做受| 国产欧美精品日韩精品| 亚洲国产精品va在线看黑人动漫| 日韩精品在线免费播放| 亚洲欧洲第一视频| 亚洲成人亚洲激情| 992tv成人免费影院| 精品网站999www| 国产欧美一区二区三区在线| 亚洲一区二区三区成人在线视频精品| 热久久这里只有| 亚洲高清久久久久久| 成人h视频在线观看播放| 91精品视频在线| 一区二区三区回区在观看免费视频| 欧美高清电影在线看| 亚洲第一偷拍网| 国产精品亚洲激情| 国产精品一区二区女厕厕| 国产综合视频在线观看| 一本一本久久a久久精品牛牛影视| 欧美日韩一区二区免费视频| 在线观看久久久久久|