`
zxlyecf2
  • 浏览: 133576 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL server 分页方法小结

    博客分类:
  • sql
阅读更多

这里面介绍一下常用的分页方法:

1.使用top来分页

select top @pageSize * from table where id not in 
(select top @pageSize*(@pageIndex-1) id from table) 

 

SELECT   *   FROM   ( 
SELECT   TOP   页面容量   *   FROM   ( 
SELECT   TOP   页面容量*当前页码   *   FROM   
表   WHERE   条件   ORDER   BY   字段A   ASC 
)   AS   TEMPTABLE1   ORDER   BY   字段A   DESC 
)   AS   TEMPTABLE2   ORDER   BY   字段A   ASC

 

2.使用 ROW_NUMBER()OVER 

SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.字段名 desc )AS Row, T.*  from 表名 T  WHERE 条件 ) TT WHERE TT.Row between 起始位置  and 结束位置;

 StringBuilder strSql = new StringBuilder();
            strSql.Append("SELECT * FROM ( ");
            strSql.Append(" SELECT ROW_NUMBER() OVER (");
            if (!string.IsNullOrWhiteSpace(orderby.Trim()))
            {
                strSql.Append("order by T." + orderby);
            }
            else
            {
                strSql.Append("order by T.ID desc");
            }
            strSql.Append(")AS Row, T.*  from TableName T ");
            if (!string.IsNullOrWhiteSpace(strWhere.Trim()))
            {
                strSql.Append(" WHERE " + strWhere);
            }
            strSql.Append(" ) TT");
            strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);

 3.使用分页存储过程

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sys_Page_v2]
GO
CREATE PROCEDURE [dbo].[sys_Page_v2]
@PCount int output,    --总页数输出
@RCount int output,    --总记录数输出
@sys_Table nvarchar(100),    --查询表名
@sys_Key varchar(50),        --主键
@sys_Fields nvarchar(500),    --查询字段
@sys_Where nvarchar(3000),    --查询条件
@sys_Order nvarchar(100),    --排序字段
@sys_Begin int,        --开始位置
@sys_PageIndex int,        --当前页数
@sys_PageSize int        --页大小
AS
SET NOCOUNT ON
SET ANSI_WARNINGS ON
IF @sys_PageSize < 0 OR @sys_PageIndex < 0
BEGIN        
RETURN
END
DECLARE @new_where1 NVARCHAR(3000)
DECLARE @new_order1 NVARCHAR(100)
DECLARE @new_order2 NVARCHAR(100)
DECLARE @Sql NVARCHAR(4000)
DECLARE @SqlCount NVARCHAR(4000)
DECLARE @Top int
if(@sys_Begin <=0)
    set @sys_Begin=0
else
    set @sys_Begin=@sys_Begin-1
IF ISNULL(@sys_Where,'') = ''
    SET @new_where1 = ' '
ELSE
    SET @new_where1 = ' WHERE ' + @sys_Where 
IF ISNULL(@sys_Order,'') <> '' 
BEGIN
    SET @new_order1 = ' ORDER BY ' + Replace(@sys_Order,'desc','')
    SET @new_order1 = Replace(@new_order1,'asc','desc')
    SET @new_order2 = ' ORDER BY ' + @sys_Order
END
ELSE
BEGIN
    SET @new_order1 = ' ORDER BY ID DESC'
    SET @new_order2 = ' ORDER BY ID ASC'
END
SET @SqlCount = 'SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1)+0.0)/'
            + CAST(@sys_PageSize AS NVARCHAR)+') FROM ' + @sys_Table + @new_where1
EXEC SP_EXECUTESQL @SqlCount,N'@RCount INT OUTPUT,@PCount INT OUTPUT',
               @RCount OUTPUT,@PCount OUTPUT
IF @sys_PageIndex > CEILING((@RCount+0.0)/@sys_PageSize)    --如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数
BEGIN
    SET @sys_PageIndex =  CEILING((@RCount+0.0)/@sys_PageSize)
END
set @sql = 'select '+ @sys_fields +' from ' + @sys_Table + ' w1 '
    + ' where '+ @sys_Key +' in ('
        +'select top '+ ltrim(str(@sys_PageSize)) +' ' + @sys_Key + ' from '
        +'('
            +'select top ' + ltrim(STR(@sys_PageSize * @sys_PageIndex + @sys_Begin)) + ' ' + @sys_Key + ' FROM ' 
        + @sys_Table + @new_where1 + @new_order2 
        +') w ' + @new_order1
    +') ' + @new_order2
print(@sql)
Exec(@sql)
GO

 

create proc [dbo].[pro_commonpage]
(
@pageindex int, ---当前页的索引
@pagesiz int,--一页显示多少条
@tablename nvarchar(100),---要分页的表名
@prikey varchar(50),--要分页的表名的主键
@condtion varchar(5000),----查询条件
@pagecount int out----按照查询条件查询出的总页数
)
as
-----第一步构建查询的sql语句--------
declare @sql nvarchar(4000), ---查询语句
        @recrdcount int,----记录数据的总行数
        @startindex int,---当前页的第一条数据的行号
        @endindex int----当前页的最后一条数据的行号
 set @sql = 'Select @rCount= count(*)  From '+@tablename+' Where 1= 1 ';---查询除所有的数据并得到数据行数
  if @condtion is not null and @condtion <>N''---当查询条件不为空的时候和不等于“”
  begin
  set @sql=@sql+@condtion;---@sql+查询条件
  end
  print @sql
  ----利用sp_executesql这个存储过程来执行@sql,
  --N'@rcount int out 同@sql中的@rcount对应声明变量,将@recrdcount赋值替换@rcount
  exec sp_executesql @sql,N'@rcount int out',@recrdcount out;
  ---计算最大分页数
  
  set @pagecount=CEILING(@recrdcount*1.0/@pagesiz);--ceiling函数就是将小数位抹去并在整数位加1,
  if(@pageindex>@pagecount)---当当前页的页码大于最大页的页码
  begin
  set @pageindex=@pagecount ---设置当前页的页码为最大页的页码
  end
  
  set @startindex=(@pageindex-1)*@pagesiz+1---设置当前页的起始行号
  set @endindex =@pageindex*@pagesiz ----设置当前页的最后一条数据的行号
  ---构建分页的sql
  set @sql=''
  set @sql='select row_number() over (order by '+@prikey+' asc)as rowid,*from ' + @tablename +' where 1=1'---开窗函数获取当前查询表的数据行数
  if @condtion is not null and @condtion <>N'' --如果查询条件不为空
  begin
  set @sql=@sql+@condtion ---为sql加上查询条件
  end
  set @sql = 'Select * From ('+@sql+') as tc where tc.rowid between '+convert(varchar(5),@startIndex)+' and '+convert(varchar(5),@endIndex)+'';
  print @sql
  exec (@sql)

GO

 

 

 

 

  • 大小: 9 KB
4
2
分享到:
评论

相关推荐

    sqlserver分页查询处理方法小结

    在SQL Server中,由于不支持MySQL中的`LIMIT`关键字,我们通常使用其他方法来实现分页查询。SQL Server 2008引入了`TOP`和`ROW_NUMBER()`等关键字,使得分页查询成为可能。以下是对这些方法的详细解释: 1. **TOP...

    Microsoft SQL Server 2005技术内幕:存储引擎(中文).pdf

    SQL Server 2005微软官方权威参考书.  公球公认SQL Server 2005 经典著作..  数据库“铁人”、微软MVP胡百敬先生鼎力推荐  微软SQL Server 总部Principal Group 项目经理朱凌志鼎力推荐  本书详细介绍了数据...

    数据库分页SQL语句实现

    本文将详细介绍三种主流数据库(SQL Server、MySQL和Oracle)中的分页SQL语句实现方法。 #### SQL Server 的分页SQL语句实现 SQL Server 支持通过`TOP`关键字来实现分页查询。具体实现方式如下: 1. **查询第M页...

    ObjectDatasource分页小结

    ### ObjectDataSource 分页小结 在本篇小结中,我们将深入探讨如何使用ASP.NET中的`ObjectDataSource`控件实现数据分页,并结合具体的代码示例进行详细解析。`ObjectDataSource`是ASP.NET中用于从数据源加载数据的...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    ASP.NET 2.0+SQL Server 2005全程指南 目录 基础篇 第1章 ASP.NET概述及环境配置 1.1 认识ASRNET 1.1.1 .NET Framework框架 1.1.2 ASP.NET功能与特性 1.1.3 ASP.NET与ASP的区别 1.2 搭建ASP.NET开发环境 1.2.1...

    关于JDBC数据分页跨数据库小结.rar

    - SQL Server:使用`TOP`和`OFFSET`,例如`SELECT TOP (page_size) * FROM table ORDER BY id OFFSET (page - 1) * page_size ROWS`。 2. 游标实现分页: - JDBC提供ResultSet的next()方法,可以逐行读取数据,...

    高效的存储过程分页(sqlsever)

    本文将详细介绍一个SQL Server存储过程的分页实现方法,并通过前后端代码示例来说明其具体应用。 #### 存储过程实现原理 此存储过程名为`pagelist`,其主要功能是根据传入的参数获取指定表中的数据,并进行分页...

    SQLServer 2005 和Oracle 语法的一点差异小结

    在数据库管理领域,Microsoft SQL Server 2005 和 Oracle 是两种广泛使用的数据库管理系统,它们在语法上存在一些显著的差异。以下是一些关键的区别,对于熟悉一种系统但初次接触另一种系统的开发人员来说,这些差异...

    在JDBC,hibernate中实现分页

    String a = "jdbc:sqlserver://" + a1 + ";DatabaseName=KQ"; int rowTotal = 0; String sql = "SELECT COUNT(*) FROM basic WHERE deptid='" + data.getId() + "'"; try { Connection con = DriverManager....

    C#中常用的分页存储过程小结

    首先,实现分页的基本存储过程需要创建一个SQL Server存储过程,它通过SQL语句来实现分页逻辑。分页的关键在于确定当前页以及每页的记录数,然后查询出指定页的数据。为了提高效率,通常建议使用表的标识列作为分页...

    jsp分页

    小结** JSP分页技术的关键在于正确地构造SQL查询,并在客户端提供易于使用的导航。`xia.jsp`文件可能是这个分页示例的具体实现,你可以下载并研究其代码,了解如何将数据库查询、分页逻辑和页面展示结合在一起。...

    Visual C# 2008程序设计经典案例设计与实现第四章源码

    第4章 Visual C# 2008与数据库 案例1 利用DataGridView控件显示数据库信息 案例2 数据库数据记录单 案例3 利用下拉列表框动态查询数据库信息 案例4 利用ListView控件导航数据库信息 ...本章小结

    c#数据库连接说明--很基础但是也很清楚

    #### 小结 通过本文的详细介绍,我们不仅了解了如何在C#中连接和操作SQL Server及Access数据库,还学习了如何优雅地处理异常和管理数据库资源。掌握了这些核心技能,你将能够在开发过程中更加高效、安全地处理...

    ASP.NET 控件的使用

    1.5 小结 37 第2章 使用标准控件 38 2.1 显示信息 38 2.1.1 使用Label控件 38 2.1.2 使用Literal控件 42 2.2 接收用户输入 44 2.2.1 使用TextBox控件 44 2.2.2 使用CheckBox控件 50 2.2.3 使用RadioButton控件 52 ...

    农产品销售网站的设计与实现(论文+源码)-kaic.zip

    2.2 sqlserver数据库 第3章 系统分析 3.1功能需求分析 3.2业务流程分析 3.3数据流程分析 3.4本章小结 第4章 系统设计 4.1系统设计思想 4.2系统总体设计 4.3数据库设计 4.3.1概念模型设计 4.3.2数据库表设计 4.3.3...

    ASP分页时计算页面总数的几种算法小结

    在使用ASP(Active Server Pages,活动服务器页面)技术进行网站开发时,分页功能是常常需要实现的一个功能,它能够提高网站的用户体验,尤其在数据量大的情况下,分页可以避免一次性加载过多数据导致页面加载缓慢。...

    VB\SQL数据库课程设计

    【VB\SQL数据库课程设计】是一项针对VB编程语言与SQL Server数据库进行的实践性课程,目的是让学生掌握如何结合这两种技术来构建一个业务管理系统。在这个项目中,学生将设计一个平面设计公司的业务管理系统,涵盖从...

Global site tag (gtag.js) - Google Analytics