首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > 通用的存储过程分页实现思路--带源码(适用Ms SQL Server 2005)
【标  题】:通用的存储过程分页实现思路--带源码(适用Ms SQL Server 2005)
【关键字】:--,Ms,SQL,Server,2005
【来  源】:http://blog.csdn.net/lxjhb/archive/2007/02/27/1516079.aspx

通用的存储过程分页实现思路--带源码(适用Ms SQL Server 2005)

 

分页是我们开发过程中最常用到的功能,实现方式多种多样,根据项目开发中的体验,还是用存储过程分页比较不错,不管在性能上,还是方便性上都是个不错的选择。下面是用存储过程实现分页的一个思路,把源代码贴出来和大家分享。

转载或修改请注明出处,很辛苦弄出来的,哈哈^_^

同时欢迎提出宝贵意见:Com.LXJ@163.com

 

USE [tempdb]
GO
/****** Object:  StoredProcedure [dbo].[PROC_COMM_PAGE_NAVIGATION]    Script Date: 02/27/2007 16:32:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



/*
********************************************
function        :    page navigation 

create by        :    xiaojun liu (com.lxj@163.com)

create at        :    2007-02-10 

modify    by        :   

modify at        :   

remark            :   
  
case            :    

copyright        :    http://blog.csdn.net/lxjhb

********************************************
*/
 

CREATE PROCEDURE [dbo].[PROC_COMM_PAGE_NAVIGATION]
    
@TABLE_NAME VARCHAR(8000),        --table name or view     
    @PK_NAME VARCHAR(50),            --prime key column name      
    @SORT_COLUMN_NAME VARCHAR(50),    --sort column      
    @SORT_TYPE VARCHAR(10),            --sort type:asc,desc      
    @CURRENT_PAGE INT,                --current page       
    @PAGE_SIZE INT                    --page size      
AS      
    
SET NOCOUNT ON    
BEGIN    
    
DECLARE @LONGSQL  VARCHAR(8000)    
          , 
@SHORTSQL NVARCHAR(4000)    
          , 
@TAB VARCHAR(40)    
          , 
@RECORD_COUNT INT    
        
    
SELECT @TAB = 'PRT_' + REPLACE(REPLACE(CONVERT(VARCHAR,GETDATE(),13),':','') ,' ','')     
                  
+ '_' + CONVERT(VARCHAR,@@SPID)    
        
    
SELECT @LONGSQL =    
        
'SELECT IDENTITY(INT,1,1) T1RNUM, T.* ' +    
           
' INTO TEMPDB.DBO.'+ @TAB +    
        
'  FROM ( ' + @TABLE_NAME + ' ) T' +    
           
'  ORDER BY T.'+@SORT_COLUMN_NAME+' ' +     
           
CASE WHEN @SORT_TYPE <> 'DESC' THEN 'ASC'    
                
ELSE @SORT_TYPE END    
        
    
EXEC(@LONGSQL)      
        
    
SELECT @RECORD_COUNT =@@ROWCOUNT     
        
    
SELECT @SHORTSQL = 'SELECT ' +    
           
MAX(CASE WHEN COLUMN_ID = 2  THEN '  ' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 3  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 4  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 5  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 6  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 7  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 8  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 9  THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 10 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 11 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 12 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 13 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 14 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 15 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 16 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 17 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 18 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 19 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 20 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 21 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 22 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 23 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 24 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 25 THEN '' + C.NAME ELSE '' END+    
           
MAX(CASE WHEN COLUMN_ID = 26 THEN '' + C.NAME ELSE '' END+  
           
MAX(CASE WHEN COLUMN_ID = 27 THEN '' + C.NAME ELSE '' END+  
           
MAX(CASE WHEN COLUMN_ID = 28 THEN '' + C.NAME ELSE '' END+  
           
MAX(CASE WHEN COLUMN_ID = 29 THEN '' + C.NAME ELSE '' END+  
           
MAX(CASE WHEN COLUMN_ID = 30 THEN '' + C.NAME ELSE '' END+  
           
'  FROM TEMPDB.DBO.'+ @TAB +    
        
' WHERE T1RNUM >  ' +     
           
CONVERT(VARCHAR,    
           (
CASE WHEN @CURRENT_PAGE <= 0 THEN 1    
                 
WHEN @CURRENT_PAGE >=
                      
CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZE)
                 
THEN CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZE)
                 
ELSE @CURRENT_PAGE    
            
END-1* @PAGE_SIZE+    
        
'   AND T1RNUM <= ' +     
           
CONVERT(VARCHAR,    
           
CASE WHEN @CURRENT_PAGE <= 0 THEN 1    
                
WHEN @CURRENT_PAGE >= 
                     
CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZE)
                
THEN CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZE)
                
ELSE @CURRENT_PAGE    
            
END * @PAGE_SIZE)    
      
FROM TEMPDB.SYS.OBJECTS O    
      , TEMPDB.SYS.COLUMNS C    
     
WHERE O.TYPE = 'U'    
       
AND O.OBJECT_ID = C.OBJECT_ID    
       
AND O.NAME = @TAB    

    
--return result      
    SELECT @RECORD_COUNT AS 'RECORD_COUNT',      
           
CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZEAS 'PAGE_COUNT',      
           
CASE WHEN @CURRENT_PAGE <= 0 THEN 1    
                
WHEN @CURRENT_PAGE >= 
                     
CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZE)
                
THEN CEILING(CONVERT(DECIMAL(15,2),@RECORD_COUNT)/@PAGE_SIZE)
                
ELSE @CURRENT_PAGE    
            
END AS 'CURRENT_PAGE',      
           
@PAGE_SIZE    AS 'PAGE_SIZE',      
           
@CURRENT_PAGE AS 'PAGE_IN'      
        
    
EXEC DBO.SP_EXECUTESQL @SHORTSQL    

    
--drop temp table  
    SELECT @SHORTSQL = 'DROP TABLE TEMPDB.DBO.' + @TAB    
    
EXEC DBO.SP_EXECUTESQL @SHORTSQL 

END

SET NOCOUNT OFF



 

PB列表框中单击列标题实现对该列排序:【上一篇】
[Oracle] Oracle exp/imp导出导入工具的使用:【下一篇】
【相关文章】
  • 数据库中Split功能的实现--自定义函数(源码)
  • Sql Server2005学习日记(02)
  • SQL宝典:探究内连接,外连接,交叉连接 含实例(简体版)
  • MsAjax Lib-> Error 类型扩展
  • 曼波应用服务器 (Mambors App Server) 2.0 发布!
  • 使用 OpenCmsVFS 插件在 Eclipse 下进行OpenCms项目进行开发……
  • MsAjax Lib-> Number 类型扩展
  • PHP5.2+APACHE2.2+mysql4.1.21+BugFree1.0的安装
  • T-Sql 收集
  • Ms Ajax Lib-> Object 类型扩展
  • 【随机文章】
  • Ms SQL Server 中单引号的两种处理技巧
  • 可能要赔钱了
  • M-Howto 安装FTP服务器【WU-FTP版本】
  • 编译出错:storage size of `iwr' isn't known
  • ListCtrl
  • 利用Dephi5编写控制面板程序
  • JDBCTM 指南:入门5 - ResultSet
  • 想学perl,好难!
  • 中国程序员应读“名著”
  • 新病毒代码针对Windows图象处理过程中缺陷
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.