呆羊在曬太陽  
          公告
          • Y:哦,是你呀。
            X:我現在正在忙。
            Y:忙什么?
            X:呵呵,今天出太陽了,我把錢搬出來曬一曬。
            ***********************
            abc
            小叉
            很高興能結識大家!
            ***********************
          日歷
          <2005年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910
          統計
          • 隨筆 - 164
          • 文章 - 2
          • 評論 - 196
          • 引用 - 0

          導航

          常用鏈接

          留言簿(7)

          隨筆分類(158)

          文章分類(2)

          相冊

          log

          搜索

          •  

          積分與排名

          • 積分 - 71091
          • 排名 - 778

          最新評論

          閱讀排行榜

           

          數據庫分頁是一種非常有用,而且非常通用的技術,下面收集整理一些通用的存儲過程:
          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-08-11 09:52 小叉 閱讀(204) 評論(0)  編輯  收藏 所屬分類: 數據庫
           
          Copyright © 小叉 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 洛阳市| 巩留县| 华池县| 宁强县| 清河县| 开平市| 梁平县| 茌平县| 肥西县| 崇文区| 彭阳县| 垫江县| 东明县| 丰台区| 贵港市| 广灵县| 广西| 上蔡县| 鄂托克旗| 林周县| 瓦房店市| 涿州市| 枣阳市| 青海省| 金坛市| 五华县| 富民县| 南郑县| 正定县| 长白| 靖远县| 宜黄县| 剑阁县| 潜江市| 道孚县| 利津县| 长泰县| 都兰县| 柳江县| 甘南县| 乌兰浩特市|