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

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

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

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

    導(dǎo)航

    常用鏈接

    留言簿(7)

    隨筆分類(158)

    文章分類(2)

    相冊

    log

    搜索

    •  

    積分與排名

    • 積分 - 71976
    • 排名 - 771

    最新評論

    閱讀排行榜

     

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

    /*--實現(xiàn)分頁的通用存儲過程

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

    --鄒建 2003.09--*/

    /*--調(diào)用示例
     exec p_show '地區(qū)資料'

     exec p_show 'select top 100 percent * from 地區(qū)資料 order by 地區(qū)名稱',5,3,'地區(qū)編號,地區(qū)名稱,助記碼'
    --*/
    CREATE Proc p_show
    @QueryStr nvarchar(4000), --表名、視圖名、查詢語句
    @PageSize int=10,   --每頁的大小(行數(shù))
    @PageCurrent int=1,   --要顯示的頁
    @FdShow nvarchar (4000)='', --要顯示的字段列表,如果查詢結(jié)果不需要標識字段,需要指定此值,且不包含標識字段
    @FdOrder nvarchar (1000)='' --排序字段列表
    as
    set nocount on
    declare @FdName nvarchar(250) --表中的主鍵或表、臨時表中的標識列名
     ,@Id1 varchar(20),@Id2 varchar(20) --開始和結(jié)束的記錄號
     ,@Obj_ID int    --對象ID
    --表中有復(fù)合主鍵的處理
    declare @strfd nvarchar(2000) --復(fù)合主鍵列表
     ,@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  --檢查表中的主鍵是否為復(fù)合主鍵
      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

    /*--表中有復(fù)合主鍵的處理方法--*/
    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、當(dāng)有排序ID(唯一)時,可以用如下存儲過程:
    CREATE PROCEDURE SPPagediv
    @tblName   varchar(3000),       -- 表名
    @strGetFields varchar(3000) = '*',  -- 需要返回的列
    @fldName varchar(255)='',      -- 排序的字段名
    @PageSize   int = 10,          -- 頁尺寸
    @PageIndex  int = 1,           -- 頁碼
    @doCount  bit = 0,   -- 返回記錄總數(shù), 非 0 值則返回
    @OrderType bit = 0,  -- 設(shè)置排序類型, 非 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,就執(zhí)行總數(shù)統(tǒng)計。以下的所有代碼都是@doCount為0的情況

    else

    begin

     

    if @OrderType != 0

    begin

        set @strTmp = '<(select min'

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

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

    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

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

    end

    else

    begin

    --以下代碼賦予了@strSQL以真正執(zhí)行的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 小叉 閱讀(207) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
     
    Copyright © 小叉 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 亚洲成a人片在线不卡一二三区 | 亚洲av午夜成人片精品电影| 亚洲一级免费毛片| 一区二区三区四区免费视频 | 亚洲美女一区二区三区| 精品四虎免费观看国产高清午夜| 国产麻豆一精品一AV一免费| 国产AV无码专区亚洲AWWW| 亚洲成A∨人片在线观看无码| 亚洲国产精品美女久久久久| 好男人视频社区精品免费| 亚洲一卡2卡3卡4卡5卡6卡| 久久久久久毛片免费看| 亚洲αv在线精品糸列| 亚洲国产AV无码一区二区三区| 天天干在线免费视频| 亚洲精品动漫免费二区| 亚洲AV无码一区二区三区在线观看 | 国产午夜亚洲精品国产| 在线免费观看一区二区三区| 狼人大香伊蕉国产WWW亚洲| 亚洲av成人一区二区三区在线观看 | 最近中文字幕无吗免费高清 | 久久黄色免费网站| 亚洲成年人电影在线观看| 无码人妻久久一区二区三区免费丨| 亚洲熟女www一区二区三区| 亚洲av日韩av欧v在线天堂| 大地影院MV在线观看视频免费 | 四虎精品亚洲一区二区三区| 内射干少妇亚洲69XXX| a级大片免费观看| 亚洲综合无码一区二区| 在线免费观看a级片| 国产免费A∨在线播放| 亚洲综合久久成人69| 国产精品免费看香蕉| 亚洲另类古典武侠| 国产禁女女网站免费看| 成人爽a毛片免费| 亚洲不卡影院午夜在线观看|