热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MSSQL2000和2005的分页

MSSQL2000setANSI_NULLSONsetQUOTED_IDENTIFIERONgo

MSSQL2000

set ANSI_NULLS  ON
set QUOTED_IDENTIFIER  ON
go

ALTER  PROC  [ dbo ]. [ PROCE_PageView2000 ]
(
@tbname      nvarchar( 100),                -- 要分页显示的表名
@FieldKey    nvarchar( 1000),       -- 用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
@PageCurrent  int = 1,                -- 要显示的页码
@PageSize    int = 10,                 -- 每页的大小(记录数)
@FieldShow  nvarchar( 1000) = '',       -- 以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder  nvarchar( 1000) = '',       -- 以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
@WhereString     nvarchar( 1000) =N '',      -- 查询条件
@RecordCount  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( @WhereString,N '') =N ''
     SET  @WhereString =N ''
ELSE
     SET  @WhereString =N ' WHERE ( ' + @WhereString +N ' ) '

-- 如果@RecordCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@RecordCount赋值)
IF  @RecordCount  IS  NULL
BEGIN
     DECLARE  @sql  nvarchar( 4000)
     SET  @sql =N ' SELECT @RecordCount=COUNT(*) '
         +N '  FROM  ' + @tbname
         +N '   ' + @WhereString
     EXEC sp_executesql  @sql,N ' @RecordCount int OUTPUT ', @RecordCount OUTPUT
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 '   ' + @WhereString
         +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 ',
             @WhereString = REPLACE( @WhereString, @Field,N ' a. ' + @Field),
             @FieldOrder = REPLACE( @FieldOrder, @Field,N ' a. ' + @Field),
             @FieldShow = REPLACE( @FieldShow, @Field,N ' a. ' + @Field)
     SELECT  @WhereString = REPLACE( @WhereString, @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  @WhereString = ''  THEN N ' WHERE ( '
             ELSE  @WhereString +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  ' + @WhereString
         +N '   ' + @FieldOrder
         +N ' )b ON  ' + @Where1
         +N '   ' + @Where2
         +N '   ' + @FieldOrder)
END

 

MSSQL2005

set ANSI_NULLS  ON
set QUOTED_IDENTIFIER  ON
go
CREATE  PROCEDURE  [ dbo ]. [ p_GetListByPage ]
(
  @TableName  varchar( 50),             -- 表名
  @ReFieldsStr  varchar( 200=  ' * ',    -- 字段名(全部字段为*)
  @OrderString  varchar( 200),          -- 排序字段(必须!支持多字段不用加order by)
  @WhereString  varchar( 500=N '',   -- 条件语句(不用加where)
  @PageSize  int  =  10,                      -- 每页多少条记录
  @PageIndex  int  =  1 ,                -- 指定当前为第几页
  @TotalPage  int  =  0 output,              -- 总页数
  @TotalRecord  int  =  0 output             -- 返回总记录数
)
AS
BEGIN 
     -- 处理开始点和结束点
     Declare  @StartRecord  int;
     Declare  @EndRecord  int
     Declare  @TotalCountSql  nvarchar( 500); 
     Declare  @SqlString  nvarchar( 2000);    
     SET  @StartRecord  = ( @PageIndex - 1) * @PageSize  +  1
     SET  @EndRecord  =  @StartRecord  +  @PageSize  -  1 
     SET  @TotalCountSql = N ' select @TotalRecord = count(*) from  '  +  @TableName; -- 总记录数语句
     SET  @SqlString  = N ' (select row_number() over (order by  ' +  @OrderString  + ' ) as rowId, ' + @ReFieldsStr + '  from  ' +  @TableName; -- 查询语句
     --
     IF ( @WhereString=  ''  or  @WhereString != null)
         BEGIN
             SET  @TotalCountSql = @TotalCountSql  +  '   where  ' +  @WhereString;
             SET  @SqlString  = @SqlString +  '   where  ' +  @WhereString;            
         END
     -- 第一次执行得到
     IF( @TotalRecord  is  null)
        BEGIN
            EXEC sp_executesql  @totalCountSql,N ' @TotalRecord int out ', @TotalRecord output; -- 返回总记录数
       END
     SET  @TotalPage  =  CEILING( @TotalRecord * 1.0 / @PageSize)
     -- --执行主语句
     SET  @SqlString  = ' select * from  '  +  @SqlString  +  ' ) as t where rowId between  '  +  ltrim( str( @StartRecord))  +  '  and  '  +   ltrim( str( @EndRecord));
     Exec ( @SqlString);
END
GO 

 

最后@SqlString 打印结果:
select * from (select row_number() over (order by Rid desc,Writetime) as rowId,* from t_smsrecord) as t where rowId between 11 and 20

 留着自己看


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
author-avatar
SufiaLi
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有