• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
:皒祗想自私旳占有著袮
.Net Ajax SQLserver Flex UI JS 一样都不能少...
博客园    首页    新随笔    联系   管理    订阅  订阅

SQLServer存储过程分页



【摘要】
这个存储过程的功能比较强大,用在项目中非常的适用,尤其是在百万级数据上。

【全文】

SQL代码

CREATE PROCEDURE prcPageResult    
-- 获得某一页的数据 --    
@currPage int = 1,                                    --当前页页码 (即Top currPage)    
@showColumn varchar(2000) = '*',           --需要得到的字段 (即 column1,column2,)    
@tabName varchar(2000),                           --需要查看的表名 (即 from table_name)    
@strCondition varchar(2000) = '',              --查询条件 (即 where condition) 不用加where关键字    
@ascColumn varchar(100) = '',                 --排序的字段名 (即 order by column asc/desc)    
@bitOrderType bit = 0,                            --排序的类型 (0为升序,1为降序)    
@pkColumn varchar(50) = '',                   --主键名称    
@pageSize int = 20                                --分页大小    
   
AS   
BEGIN -- 存储过程开始    
--
 该存储过程需要用到的几个变量 --    
DECLARE @strTemp varchar(1000)    
DECLARE @strSql varchar(4000)                   --该存储过程最后执行的语句    
DECLARE @strOrderType varchar(1000)      --排序类型语句 (order by column asc或者order by column desc)    
   
BEGIN   
IF @bitOrderType = 1   -- 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 @currPage = 1    -- 如果是第一页    
BEGIN   
    
IF @strCondition != ''   
        
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+    
            
' WHERE '+@strCondition+@strOrderType    
    
ELSE   
        
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType    
END   
   
ELSE    -- 其他页    
BEGIN   
    
IF @strCondition !=''   
        
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+    
        
' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+    
        
' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType    
    
ELSE   
        
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+    
        
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+    
        
' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType    
END   
   
END   
EXEC (@strSql)    
END  -- 存储过程结束    
--
----------------------------------------------    
GO    
 调用方法:

prcPageResult 
1,'*','TableName','','CreateDate',1,'PkID',25

 上面表示,查询表TableName的所有字段,前25条记录,因为是第一页,排序字段为CreateDate,降序排列,主键是PkID。
@tabName2 varchar(2000),                     --第二个子查询的表名------------(更改处:由于查询条件关系,从而使tabName是两个表,这样第二个子查询也会用上这两张表..导致错误..)

可将有条件查询的第二个Top查询里的tabName改成tabName2,,

posted @ 2008-03-08 15:49  JoyBin  阅读(394)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3