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

本文介绍了一种使用SQL存储过程进行高效分页的方法。该方法通过创建临时表并利用IDENTITY函数为记录编号,实现了灵活的排序和分页功能。此外,还提供了计算总记录数、总页数及当前页的记录等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

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

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        :    

create at        :    2007-02-10 

modify    by        :   

modify at        :   

remark            :   
  
case            :    

copyright        :    http://blog.youkuaiyun.com/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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值