分页查询

 

IF   OBJECT_ID (N ' dbo.p_show ' IS   NOT   NULL
    
DROP   PROCEDURE  dbo.p_show
GO

/*--实现分页的通用存储过程

    显示指定表、视图、查询结果的第X页
    对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法
    如果视图或查询结果中有主键,不推荐此方法
    如果使用查询语句,而且查询语句使用了order by,则查询语句必须包含top 语句

最后更新时间: 2008.01.20
--邹建 2003.09(引用请保留此信息)--
*/


/*--调用示例
EXEC dbo.p_show 
    @QueryStr = N'tb',
    @PageSize = 5,
    @PageCurrent = 3,
    @FdShow = 'id, colid, name',
    @FdOrder = 'colid, name'
select id, colid from tb
order by colid, name


EXEC dbo.p_show 
    @QueryStr = N'
SELECT TOP 100 PERCENT 
    * 
FROM dbo.sysobjects
ORDER BY xtype',
    @PageSize = 5,
    @PageCurrent = 2,
    @FdShow = 'name, xtype',
    @FdOrder = 'xtype, name'
--
*/

CREATE   PROC  dbo.p_show
    
@QueryStr   nvarchar ( 4000 ),         --  表名、视图名、查询语句
     @PageSize   int = 10 ,                 --  每页的大小(行数)
     @PageCurrent   int = 1 ,                 --  要显示的页
     @FdShow   nvarchar  ( 4000 =  N '' ,     --  要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段
     @FdOrder   nvarchar  ( 1000 =  N ''      --  排序字段列表
AS
SET  NOCOUNT  ON
DECLARE
    
@FdName  sysname,     -- 表中的主键或表、临时表中的标识列名
     @Id1  sysname,         -- 开始和结束的记录号
     @Id2  sysname,
    
@Obj_ID   int              -- 对象ID

-- 表中有复合主键的处理
DECLARE
    
@strfd   nvarchar ( 2000 ),         -- 复合主键列表
     @strjoin   nvarchar ( 4000 ),     -- 连接字段
     @strwhere   nvarchar ( 2000 )     -- 查询条件


SELECT
    
@Obj_ID   =   OBJECT_ID ( @QueryStr ),
    
@FdShow   =   CASE  
                
WHEN   @FdShow   >  N ''   THEN  N '   '   +   @FdShow
                
ELSE  N '  * '
            
END ,
    
@FdOrder   =   CASE
                
WHEN   @FdOrder   >  N ''   THEN  N '  ORDER BY  '   +   @FdOrder
                
ELSE  N '   '  
            
END ,
    
@QueryStr   =   CASE
                
WHEN   @Obj_ID   IS   NULL   THEN  N '  ( '   +   @QueryStr   +  N ' )A '
                
ELSE  N '   '   +   @QueryStr
            
END

--  如果显示第一页,可以直接用 top 来完成
IF   @PageCurrent   =   1     
BEGIN
    
SELECT  
        
@Id1   =   CAST ( @PageSize   as   varchar ( 20 ))
    
EXEC (N '
SELECT TOP 
'   +   @Id1   +  N '
    
'   +   @FdShow   +  N '
FROM 
'   +   @QueryStr   +  N '
'   +   @FdOrder
)
    
RETURN
END

--  如果是表, 则检查表中是否有标识更或主键
IF   @Obj_ID   IS   NULL   OR   OBJECTPROPERTY ( @Obj_ID ' IsTable ' =   0
    
GOTO  lb_usetemp
ELSE
BEGIN
    
SELECT
        
@Id1   =   CAST ( @PageSize   as   varchar ( 20 )),
        
@Id2   =   CAST (( @PageCurrent   -   1 *   @PageSize   as   varchar ( 20 ))

    
--  标识列
     SELECT
        
@FdName   =  name
    
FROM  dbo.syscolumns
    
WHERE  id  =   @Obj_ID
        
AND  status  =   0x80
    
IF   @@ROWCOUNT   =   0              -- 如果表中无标识列,则检查表中是否有主键
     BEGIN
        
DECLARE
            
@pk_number   int

        
SELECT
            
@strfd   =  N '' ,
            
@strjoin   =  N '' ,
            
@strwhere   =  N ''

        
SELECT
            
@strfd   =   @strfd  
                    
+  N ' , '   +   QUOTENAME (name),
            
@strjoin   =   @strjoin  
                    
+  N '  AND A. '   +   QUOTENAME (name) 
                    
+  N ' =B. '   +    QUOTENAME (name),
            
@strwhere   =   @strwhere  
                    
+  N '  AND B. '   +   QUOTENAME (name)  +  N '  IS NULL '
        
FROM (
            
SELECT
                IX.id, IX.indid,
                IXC.colid, ixc.keyno,
                C.name
            
FROM  dbo.sysobjects O, 
                dbo.sysindexes IX,
                dbo.sysindexkeys IXC,
                dbo.syscolumns C
            
WHERE  O.parent_obj  =   @Obj_ID
                
AND  O.xtype  =   ' PK '
                
AND  O.name  =  IX.name
                
AND  IX.id  =   @Obj_ID
                
AND  IX.id  =  IXC.id
                
AND  IX.indid  =  IXC.indid
                
AND  IXC.id  =  C.id
                
AND  IXC.colid  =  C.colid
        )A
        
ORDER   BY  keyno

        
SELECT
            
@pk_number   =   @@ROWCOUNT ,            
            
@strfd   =   STUFF ( @strfd 1 1 , N '' ),
            
@strjoin   =   STUFF ( @strjoin 1 5 , N '' ),
            
@strwhere   =   STUFF ( @strwhere 1 5 , N '' )            

        
IF   @pk_number   =   0
            
GOTO  lb_usetemp         -- 如果表中无主键,则用临时表处理
         ELSE   IF   @pk_number   =   1
        
BEGIN
            
SELECT
                
@FdName   =   @strfd
            
GOTO  lb_useidentity     --  使用单一主键
         END
        
ELSE
            
GOTO  lb_usepk         --  使用复合主键
     END
END

/*--使用标识列或主键为单一字段的处理方法--*/
lb_useidentity:    
EXEC (N '
SELECT TOP 
'   +   @Id1   +  N '
    
'   +   @FdShow   +  N '
FROM 
' + @QueryStr   +  N '
WHERE 
'   +   @FdName   +   '  NOT IN(
        SELECT TOP 
'   +   @Id2   +  N '
            
'   +   @FdName   +   '
        FROM 
'   +   @QueryStr   +  N '
        
'   +   @FdOrder   +  N ' )
'   +   @FdOrder   +  N '
' )
RETURN

/*--表中有复合主键的处理方法--*/
lb_usepk:        
EXEC (N '
SELECT 
    
'   +   @FdShow   +  N '
FROM(
    SELECT TOP 
'   +   @Id1   +  N '
        A.*
    FROM 
'   +   @QueryStr   +  N '  A
        LEFT JOIN(
                SELECT TOP 
'   +   @Id2   +  N '
                    
'   +   @strfd   +  N '  
                FROM 
'   +   @QueryStr   +  N '
                
'   +   @FdOrder   +  N '
            )B
                ON 
'   +   @strjoin   +  N '
    WHERE 
'   +   @strwhere   +  N '
    
'   +   @FdOrder   +  N '
)A
'   +   @FdOrder   +  N '
' )
RETURN

/*--用临时表处理的方法--*/
lb_usetemp:        
SELECT
    
@FdName   =   QUOTENAME (N ' ID_ '   +   CAST ( NEWID ()  as   varchar ( 40 ))),
    
@Id1   =   CAST ( @PageSize   *  ( @PageCurrent - 1 as   varchar ( 20 )),
    
@Id2   =   CAST ( @PageSize   *   @PageCurrent - 1   as   varchar ( 20 ))

EXEC (N '
SELECT 
    
'   +   @FdName   +  N '  = IDENTITY(int, 0, 1),
    
'   +   @FdShow   +  N '
INTO #tb
FROM(
    SELECT TOP 100 PERCENT 
        * 
    FROM 
'   +   @QueryStr   +  N '
    
'   +   @FdOrder   +  N '
)A
'   +   @FdOrder   +  N '

SELECT 
    
'   +   @FdShow   +  N '
FROM #tb 
WHERE 
'   +   @FdName   +   '  BETWEEN  '   +   @Id1   +   '  AND  '   +   @Id2   +  N '
'
)
GO
  • 0
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值