<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Frank Hawker

    當程序員的大頭鷹

    數據庫的分頁存儲過程

    數據庫分頁是一種非常有用,而且非常通用的技術,下面收集整理一些通用的存儲過程:
    1、CSDN社區鄒建寫的一個通用存儲過程
    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

    /*--實現分頁的通用存儲過程

     顯示指定表、視圖、查詢結果的第X頁
     對于表中主鍵或標識列的情況,直接從原表取數查詢,其它情況使用臨時表的方法
     如果視圖或查詢結果中有主鍵,不推薦此方法
     如果使用查詢語句,而且查詢語句使用了order by,則查詢語句必須包含top 語句

    --鄒建 2003.09--*/

    /*--調用示例
     exec p_show '地區資料'

     exec p_show 'select top 100 percent * from 地區資料 order by 地區名稱',5,3,'地區編號,地區名稱,助記碼'
    --*/
    CREATE Proc p_show
    @QueryStr nvarchar(4000), --表名、視圖名、查詢語句
    @PageSize int=10,   --每頁的大小(行數)
    @PageCurrent int=1,   --要顯示的頁
    @FdShow nvarchar (4000)='', --要顯示的字段列表,如果查詢結果不需要標識字段,需要指定此值,且不包含標識字段
    @FdOrder nvarchar (1000)='' --排序字段列表
    as
    set nocount on
    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、當有排序ID(唯一)時,可以用如下存儲過程:
    CREATE PROCEDURE SPPagediv
    @tblName   varchar(3000),       -- 表名
    @strGetFields varchar(3000) = '*',  -- 需要返回的列
    @fldName varchar(255)='',      -- 排序的字段名
    @PageSize   int = 10,          -- 頁尺寸
    @PageIndex  int = 1,           -- 頁碼
    @doCount  bit = 0,   -- 返回記錄總數, 非 0 值則返回
    @OrderType bit = 0,  -- 設置排序類型, 非 0 值則降序
    @strWhere  varchar(1500) = ''  -- 查詢條件 (注意: 不要加 where)

    AS

    declare @strSQL   varchar(5000)       -- 主語句

    declare @strTmp   varchar(110)        -- 臨時變量

    declare @strOrder varchar(400)        -- 排序類型


     begin
      replace(@strGetFields,'''','''''')
     end
     

    if @doCount != 0
      begin
        if @strWhere !=''
         set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
        else
      set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
      end
    --以上代碼的意思是如果@doCount傳遞過來的不是0,就執行總數統計。以下的所有代碼都是@doCount為0的情況

    else

    begin

     

    if @OrderType != 0

    begin

        set @strTmp = '<(select min'

    set @strOrder = ' order by [' + @fldName +'] desc'

    --如果@OrderType不是0,就執行降序,這句很重要!

    end

    else

    begin

        set @strTmp = '>(select max'

        set @strOrder = ' order by [' + @fldName +'] asc'

    end

     

    if @PageIndex = 1

    begin

        if @strWhere != '' 

        set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder

         else

         set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ['+ @tblName + '] '+ @strOrder

    --如果是第一頁就執行以上代碼,這樣會加快執行速度

    end

    else

    begin

    --以下代碼賦予了@strSQL以真正執行的SQL代碼

    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '

        + @tblName + ' where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder

     

    if @strWhere != ''

        set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '

            + @tblName + ' where [' + @fldName + ']' + @strTmp + '(['

            + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['

            + @fldName + '] from ' + @tblName + ' where ' + @strWhere + ' '

            + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

    end

    end 

    exec (@strSQL)

    GO

    這個存儲過程如下文章中獲得:
    http://soft.zol.com.cn/2005/0117/144785.shtml

    posted on 2005-05-10 09:13 大頭鷹 閱讀(678) 評論(0)  編輯  收藏 所屬分類: 工作札記

    導航

    統計

    公告

    常用鏈接

    留言簿(3)

    我參與的團隊

    隨筆分類(6)

    隨筆檔案(17)

    文章檔案(1)

    收藏夾(2)

    Friends' Blog

    積分與排名

    最新評論

    主站蜘蛛池模板: 99免费在线观看视频| 亚洲精品无码久久久久秋霞| 亚洲中文字幕无码爆乳av中文| 免费国产综合视频在线看 | 亚洲国产美女视频| 精品亚洲成a人片在线观看 | 浮力影院第一页小视频国产在线观看免费| 100000免费啪啪18免进| 亚洲午夜国产精品无码老牛影视| 免费一级毛片在线播放| 无码专区一va亚洲v专区在线| 免费观看无遮挡www的小视频| 96免费精品视频在线观看| 最近2019中文字幕免费大全5| 成人免费激情视频| 国产a视频精品免费观看| 野花高清在线电影观看免费视频| 国产免费播放一区二区| www.xxxx.com日本免费| a级毛片在线免费看| 免费看又黄又无码的网站| 1000部羞羞禁止免费观看视频| 精品无码免费专区毛片| 成人免费在线观看网站| 免费夜色污私人影院在线观看| 亚洲一区二区三区香蕉| 亚洲一区二区电影| 亚洲一区二区三区写真| 亚洲人成网站日本片| 亚洲女女女同性video| 新最免费影视大全在线播放| 国色精品va在线观看免费视频 | 中文字幕在线免费视频| 麻豆精品不卡国产免费看| 2022久久国产精品免费热麻豆| 成年18网站免费视频网站| 亚洲精品国产成人影院| 久久精品亚洲视频| 亚洲中文字幕无码爆乳app| 野花视频在线官网免费1| 嫩草成人永久免费观看|