分页存储过程(转)

分页存储过程(转)

CREATE PROC
 sp_PageView
@tbname     sysname,               —要分页显示的表名



@FieldKey   nvarchar(1000),      —用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段


@PageCurrent int=1,               —要显示的页码


@PageSize   int=10,                —每页的大小(记录数)


@FieldShow nvarchar(1000)=”,      —以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段


@FieldOrder nvarchar(1000)=”,      —以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC


                                          用于指定排序顺序
@Where    nvarchar(1000)=”,     —查询条件



@PageCount int OUTPUT             —总页数


AS


SET NOCOUNT ON


—检查对象是否有效


IF OBJECT_ID(@tbname) IS NULL


BEGIN

    

RAISERROR(N‘对象”%s”不存在‘,1,16,@tbname
)
    
RETURN



END


IF OBJECTPROPERTY(OBJECT_ID(@tbname),N‘IsTable‘)=0

    

AND OBJECTPROPERTY(OBJECT_ID(@tbname),N‘IsView‘)=0

    

AND OBJECTPROPERTY(OBJECT_ID(@tbname),N‘IsTableFunction‘)=0


BEGIN

    

RAISERROR(N‘“%s”不是表、视图或者表值函数‘,1,16,@tbname
)
    
RETURN



END


—分页字段检查


IF ISNULL(@FieldKey,N”)=”


BEGIN

    

RAISERROR(N‘分页处理需要主键(或者惟一键)‘,1,16
)
    
RETURN



END


—其他参数检查及规范


IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1


IF ISNULL(@PageSize,0)<1 SET @PageSize=10


IF ISNULL(@FieldShow,N”)=N” SET @FieldShow=N‘*‘


IF ISNULL(@FieldOrder,N”)=N”

    

SET @FieldOrder=N”


ELSE

    

SET @FieldOrder=N‘ORDER BY ‘+LTRIM(@FieldOrder
)
IF ISNULL(@Where,N”)=N”


    

SET @Where=N”


ELSE

    

SET @Where=N‘WHERE (‘+@Where+N‘)‘


—如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)


IF @PageCount IS NULL


BEGIN

    

DECLARE @sql nvarchar(4000
)
    
SET @sql=N‘SELECT @PageCount=COUNT(*)‘


        

+N‘ FROM ‘+@tbname

        

+N‘ ‘+@Where

    

EXEC sp_executesql @sql,N‘@PageCount int OUTPUT‘,@PageCount
 OUTPUT
    
SET @PageCount=(@PageCount+@PageSize–1)/@PageSize



END


—计算分页显示的TOPN值


DECLARE @TopN varchar(20),@TopN1 varchar(20
)
SELECT @TopN=@PageSize

,
    
@TopN1=(@PageCurrent–1)*@PageSize


—第一页直接显示


IF @PageCurrent=1

    

EXEC(N‘SELECT TOP ‘+@TopN

        

+N‘ ‘+@FieldShow

        

+N‘ FROM ‘+@tbname

        

+N‘ ‘+@Where

        

+N‘ ‘+@FieldOrder
)
ELSE



BEGIN

    

—处理别名


    IF @FieldShow=N‘*‘

        

SET @FieldShow=N‘a.*‘

    
—生成主键(惟一键)处理条件


    DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000
),
        
@s nvarchar(1000),@Field

 sysname
    
SELECT @Where1=N”,@Where2=N”,@s=@FieldKey


    

WHILE CHARINDEX(N‘,‘,@s)>0

        

SELECT @Field=LEFT(@s,CHARINDEX(N‘,‘,@s)–1
),
            
@s=STUFF(@s,1,CHARINDEX(N‘,‘,@s),N”

),
            
@Where1=@Where1+N‘ AND a.‘+@Field+N‘=b.‘+@Field

,
            
@Where2=@Where2+N‘ AND b.‘+@Field+N‘ IS NULL‘

,
            
@Where=REPLACE(@Where,@Field,N‘a.‘+@Field

),
            
@FieldOrder=REPLACE(@FieldOrder,@Field,N‘a.‘+@Field

),
            
@FieldShow=REPLACE(@FieldShow,@Field,N‘a.‘+@Field

)
    
SELECT @Where=REPLACE(@Where,@s,N‘a.‘+@s

),
        
@FieldOrder=REPLACE(@FieldOrder,@s,N‘a.‘+@s

),
        
@FieldShow=REPLACE(@FieldShow,@s,N‘a.‘+@s

),
        
@Where1=STUFF(@Where1+N‘ AND a.‘+@s+N‘=b.‘+@s,1,5,N”

),    
        
@Where2=CASE


            

WHEN @Where=” THEN N‘WHERE (‘

            

ELSE @Where+N‘ AND (‘

            

END+N‘b.‘+@s+N‘ IS NULL‘+@Where2+N‘)‘

    
—执行查询


    EXEC(N‘SELECT TOP ‘+@TopN

        

+N‘ ‘+@FieldShow

        

+N‘ FROM ‘+@tbname

        

+N‘ a LEFT JOIN(SELECT TOP ‘+@TopN1

        

+N‘ ‘+@FieldKey

        

+N‘ FROM ‘+@tbname

        

+N‘ a ‘+@Where

        

+N‘ ‘+@FieldOrder

        

+N‘)b ON ‘+@Where1

        

+N‘ ‘+@Where2

        

+N‘ ‘+@FieldOrder
)
END


转载于:https://www.cnblogs.com/3_mu/archive/2010/06/27/1766131.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/110758.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据库 部分函数依赖 完全函数依赖 传递函数依赖 第一范式、第二范式、第三范式、BCNF范式区别

    数据库 部分函数依赖 完全函数依赖 传递函数依赖 第一范式、第二范式、第三范式、BCNF范式区别数据库部分函数依赖完全函数依赖传递函数依赖第一范式、第二范式、第三范式、BCNF范式区别在理解函数依赖之前,先来看一下函数依赖分析:在关系中,包括在任何候选码中的属性称为主属性;不包括在任何候选码中的属性称为非主属性。函数依赖只分析关系中的非主属性对主属性之间的依赖关系,并不分析主属性对主键(码)的依赖关系。具体关于部分函数依赖和完全函数依赖的定义,网上有很…

    2022年5月23日
  • sp_executesql接收返回多个参数实例

    sp_executesql接收返回多个参数实例近日做项目中需要在EXEC执行Sql字符串时动态的传入参数并接收返回值,于是研究了一下SqlServer中sp_executesql的使用方法,并做了如下的例子。在使用sp_executesql动态传入与接收返回参数时需注意以下事项,以避免大家走弯路。例子中@SQLString,@ParmDefinition一定要使用NVARCHAR类型,否则会报“过程需要参数××××为ntext/n

    2022年5月11日
  • c语言hello world代码(代码编程入门)

    usingSystem;usingSystem.Collections.Generic;publicclassMyClass{ structName{ publicstringFirstName; publicstringLastName; publicstringGetName(){ returnFirstName+”·”+LastName; } } structVector3{ publicfloatx;

    2022年4月15日
  • 编译原理文法详解_编译原理为什么存在递归文法

    编译原理文法详解_编译原理为什么存在递归文法引言学完了词法分析,我们知道词法分析器将正则表达式转换成词法单元流,但对于这个记号流我们不知道是否能由正确的文法产生,因此我们需要通过语法分析器来检测其合法性。语法分析器的输出是一棵语法分析树(无论显性还是隐性),并且进行一些语法纠错处理。语法分析的整个过程大概就是我们先定义一个语法,再用相应的算法来检测我们的词法单元流是否符合该语法。这里主要讨论上下文无关文法构成的语法和自顶向下、自底向上的语…

    2022年10月28日
  • 通过mycat创建表 (报错:ERROR 1064 (HY000): op table not in schema—-)

    通过mycat创建表 (报错:ERROR 1064 (HY000): op table not in schema—-)

    2021年5月13日
  • 木马免杀方式_木马入侵的常见方法

    木马免杀方式_木马入侵的常见方法前言免杀,又叫免杀毒技术,是反病毒,反间谍的对立面,是一种能使病毒或木马免于被杀毒软件查杀的软件。它除了使病毒木马免于被查杀外,还可以扩增病毒木马的功能,改变病毒木马的行为。免杀的基本特征是破坏特征,有可能是行为特征,只要破坏了病毒与木马所固有的特征,并保证其原有功能没有改变,一次免杀就能完成了。免杀技术也并不是十恶不赦的,例如,在软件保护所用的加密产品(比如壳)中,有一些会被杀毒软件认为是木马病毒;一些安全领域中的部分安全检测产品,也会被杀毒软件误杀,这时就需要免杀技术来应对这些不稳定因素。1、裸

    2022年8月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号