空間站

          北極心空

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          create Proc p_show 
          @QueryStr nvarchar(4000), --表名、視圖名、查詢語句 
          @PageSize int=10,   --每頁的大小(行數(shù)) 
          @PageCurrent int=1,   --要顯示的頁 
          @FdShow nvarchar (4000)='', --要顯示的字段列表,如果查詢結(jié)果有標(biāo)識字段,需要指定此值,且不包含標(biāo)識字段 
          @FdOrder nvarchar (1000)='' --排序字段列表 
          as 
          declare @FdName nvarchar(250) --表中的主鍵或表、臨時表中的標(biāo)識列名 
           ,@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 
           
          --如果是表,則檢查表中是否有標(biāo)識更或主鍵 
          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   --如果表中無標(biāo)識列,則檢查表中是否有主鍵 
           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 
           
          /*--使用標(biāo)識列或主鍵為單一字段的處理方法--*/ 
          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 
           ) 

          posted on 2007-06-27 13:15 蘆葦 閱讀(378) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫
          主站蜘蛛池模板: 蒲城县| 历史| 商洛市| 静安区| 建平县| 顺义区| 甘德县| 平阴县| 罗平县| 乐安县| 南平市| 通州区| 石河子市| 多伦县| 故城县| 昆山市| 泰顺县| 桐城市| 启东市| 华亭县| 祥云县| 巧家县| 蓬安县| 邹城市| 东阿县| 阿巴嘎旗| 曲沃县| 中卫市| 郴州市| 阿尔山市| 永兴县| 乐清市| 宜州市| 河北省| 宜城市| 神木县| 达孜县| 民勤县| 隆尧县| 库伦旗| 泰顺县|