通用存储过程分页---(测试能用的请放心试用)

参数:分页大小,第几页,需要得到的字段 ,需要查询的表 , 查询条件,排序的字段名,排序的类型,主键名称
    
   分页大小:整数
    第几页:整数
需要得到的字段:字符串
 需要查询的表:字符串
    查询条件:字符串
  排序的字段名:字符串
  排序的类型:整形
    主键名称:字符串
输入参数即可查询,无论是查询一条记录还是查询多条记录,无论是分页还是不分页,无论是需要查询条件还是不需要查询条件……,都可使用此通用的存储过程!!!
通用性相当好!!
ContractedBlock.gif ExpandedBlockStart.gif SQL Code
USE zxzb
GO
IF EXISTS(SELECT 
* FROM sys.objects WHERE NAME='cndoup_GetPageOfRecords')
  DROP PROCEDURE cndoup_GetPageOfRecords
GO
--创建存储过程
CREATE PROCEDURE cndoup_GetPageOfRecords
  @pageSize 
int = 20,                                                --分页大小
  @currentPage 
int ,                                                 --第几页
  @columns varchar(
1000= '*',                            --需要得到的字段 
  @tableName varchar(
100),                                     --需要查询的表    
  @condition varchar(
1000= '',                         --查询条件, 不用加where关键字
  @ascColumn varchar(
100= '',                            --排序的字段名 (即 order by column asc/desc)
  @bitOrderType 
int = 0,                                         --排序的类型 (0为升序,1为降序)
  @pkColumn varchar(
50= ''                                 --主键名称

AS
BEGIN                                                                                    
--存储过程开始
  DECLARE @strTemp varchar(
300)
  DECLARE @strSql varchar(
5000)                            --该存储过程最后执行的语句
  DECLARE @strOrderType varchar(
1000)                --排序类型语句 (order by column asc或者order by column desc)

  BEGIN
    IF @bitOrderType 
= 1                --降序
      BEGIN
        SET @strOrderType 
= ' ORDER BY '+@ascColumn+' DESC'
        SET @strTemp 
= '<(SELECT min'
      END
    ELSE                  
--升序
      BEGIN
        SET @strOrderType 
= ' ORDER BY '+@ascColumn+' ASC'
        SET @strTemp 
= '>(SELECT max'
      END

    IF @currentPage 
= 1            --第一页
      BEGIN
        IF @condition 
!= ''
          SET @strSql 
= 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
            
' WHERE '+@condition+@strOrderType
        ELSE
          SET @strSql 
= 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType
      END

    ELSE                  
-- 其他页
      BEGIN
        IF @condition 
!=''
          SET @strSql 
= 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
          
' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+
          
' '+@pkColumn+' FROM '+@tableName+' where'+@condition+@strOrderType+') AS TabTemp)'+@strOrderType
        ELSE
          SET @strSql 
= 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
          
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+
          
' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType
      END

  END
  EXEC (@strSql)
--print @strSql
END


exec cndoup_GetPageOfRecords 
5,1,'ap_id,ap_title,ap_addtime','tb_ArtPaper','','ap_id',1,'ap_id'

 
自己的测试
如下
 
测试户数据库 表 如下
 

 第二个分页存储过程

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gif   /**//*  
     函数名称: GetRecordFromPage  
     函数功能: 获取指定页的数据  
     参数说明: @tblName      包含数据的表名  
              @fldName      关键字段名  
              @PageSize     每页记录数  
              @PageIndex    要获取的页码  
              @OrderType    排序类型, 0 - 升序, 1 - 降序  
              @strWhere     查询条件 (注意: 不要加 where)  
     作  者: 铁拳  
     邮  箱: sunjianhua_kki@sina.com  
     创建时间: 2004-07-04  
     修改时间: 2004-07-04  
   
*/
  
  CREATE PROCEDURE GetRecordFromPage  
       @tblName      varchar(
255),       -- 表名  
       @fldName      varchar(
255),       -- 字段名  
       @PageSize     
int = 10,           -- 页尺寸  
       @PageIndex    
int = 1,            -- 页码  
       @OrderType    bit 
= 0,            -- 设置排序类型, 非 0 值则降序  
       @strWhere     varchar(
2000= ''  -- 查询条件 (注意: 不要加 where)  
   AS  
     
   declare @strSQL   varchar(
6000)       -- 主语句  
   declare @strTmp   varchar(
1000)       -- 临时变量  
   declare @strOrder varchar(
500)        -- 排序类型  
     
   
if @OrderType != 0  
   begin  
       
set @strTmp = '<(select min'  
       
set @strOrder = ' order by [' + @fldName + '] desc'  
   end  
   
else  
   begin  
       
set @strTmp = '>(select max'  
       
set @strOrder = ' order by [' + @fldName +'] asc'  
   end  
     
   
set @strSQL = 'select top ' + str(@PageSize) + ' * 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) + ' * from ['  
           
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['  
           
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['  
           
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '  
           
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder  
     
   
if @PageIndex = 1  
   begin  
       
set @strTmp = ''  
       
if @strWhere != ''  
           
set @strTmp = ' where (' + @strWhere + ')'  
     
       
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['  
           
+ @tblName + ']' + @strTmp + ' ' + @strOrder  
   end  
     
   exec (@strSQL)  
     
   GO

exec GetRecordFromPage 
'tbTest','T_ID',20,80000,true,'1=1'

 

 两个测试效果如下

 测试的数据库为2768000 数据其结果差不多两个都经过测试能用

转载于:https://www.cnblogs.com/yinyao/archive/2009/10/22/1588025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值