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

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

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

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

    導航

    常用鏈接

    留言簿(7)

    隨筆分類(158)

    文章分類(2)

    相冊

    log

    搜索

    •  

    積分與排名

    • 積分 - 70667
    • 排名 - 781

    最新評論

    閱讀排行榜

     

    數據庫分頁是一種非常有用,而且非常通用的技術,下面收集整理一些通用的存儲過程:
    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 小叉 閱讀(201) 評論(0)  編輯  收藏 所屬分類: 數據庫
     
    Copyright © 小叉 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 久久久久亚洲AV无码专区桃色| 成人免费视频观看无遮挡| 亚洲国产综合人成综合网站| 亚洲变态另类一区二区三区| 免费看少妇作爱视频| 大桥未久亚洲无av码在线| 国产中文字幕免费| 男女交性无遮挡免费视频| 亚洲色偷偷综合亚洲AV伊人| 国产线视频精品免费观看视频| 国产亚洲真人做受在线观看| 国产偷伦视频免费观看| 亚洲国产人成网站在线电影动漫| 最近免费中文字幕mv在线电影| 久久亚洲国产成人精品性色| 国产精彩免费视频| 亚洲AV一区二区三区四区| 亚洲成AV人在线观看网址| 国产精品视频全国免费观看| 精品亚洲综合在线第一区| 免费在线观看h片| 亚洲人成欧美中文字幕| 免费国产在线观看| 大地资源在线资源免费观看| 亚洲视频手机在线| 性感美女视频在线观看免费精品 | 男女一进一出抽搐免费视频| 亚洲日韩乱码中文无码蜜桃臀网站| 中文成人久久久久影院免费观看| 亚洲视频一区调教| 午夜一区二区免费视频| 一区二区三区免费电影| 亚洲欧洲第一a在线观看| 性感美女视频在线观看免费精品| 久久久久久久国产免费看| 亚洲成av人片在线看片| 免费一级毛片免费播放| 免费无码又爽又刺激高潮视频| 亚洲精品成a人在线观看☆| 亚洲人成无码网站| 全免费a级毛片免费**视频|