`

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分页查询处理方法小结

    sqlserver2008不支持关键字limit ,所以它的分页sql查询语句将不能用MySQL的方式进行,幸好sqlserver2008提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页。 下面是本人在网上查阅到的几种查询脚本...

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

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

    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...

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

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

    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...

    农产品购物系统设计与实现(论文+源码)-kaic.doc

    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...

    农产品购物系统设计与实现(论文+源码)-kaic.doc

    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.NET.4揭秘

    asp.net 4揭秘.第1卷》 第一部分 构建asp.net页面 第1章 asp.net framework概览2 1.1 asp.net和.net framework5 1.1.1 框架类库5 1.1.2 公共语言运行库10 1.2 asp.net控件11 1.2.1 asp.net控件概览11 ...25.4 小结882

    Visual C#.NET 2008程序设计案例集锦 (源码)

    前言. 第1章 Windows窗体技术 案例1.1 多文档MDI应用程序 案例1.2 QQ窗体 案例1.3 卡通窗体, 案例1.4 带有分隔栏并更换主界面背景窗体 案例1.5 半透明渐显动画和渐变窗体 案例1.6 浮动的窗体 ...本章小结

    php网络开发完全手册

    1.7 小结 23 第2章 PHP的基础语法 24 2.1 语言构成与工作原理 24 2.2 常量与变量 25 2.2.1 常量的定义 25 2.2.2 变量的定义 26 2.2.3 变量的作用域 27 2.2.4 动态变量 29 2.3 运算符和关键字 29 2.4 流程控制语法 30...

    JDBC 3.0数据库开发与设计

    目录 第1章 JDBC概述 1.1 JDBC简介 1.2 JDBC3.0规范 1.3 JDBC3.0 API的新特点 1.3.1 JDBC 3.0 API的一致性 1.3.2 不赞成的API 1.4 JDBC 3.0中的类和接口 1.4.1 java.sql包中的类和接口及其...9.5 本章小结

    ADO.NET 2.0技术内幕(高清 中文 带书签 全)

    ADO.NET 2.0技术内幕(高清 中文 带书签 全) 编辑推荐 核心主题全面涵盖,深入剖析个人精髓;示例丰富,同时提供Visual ...15.6 小结 15.7 常见问题 第Ⅴ部分 附录 附录A 使用其他.NET数据提供程序 附录B 示例和工具

    ASP3《高级编程》(第一部分)

    10.4.4 数据分页小结 336 10.5 使用数据库中的图像 337 10.6 小结 338 第11章 使用XML数据 339 11.1 XML的定义 339 11.1.1 XML和HTML的差别 340 11.1.2 标记和元素 343 11.1.3 模式和文档类型定义 346 ...

    ASP3《高级编程》(第二部分)

    10.4.4 数据分页小结 336 10.5 使用数据库中的图像 337 10.6 小结 338 第11章 使用XML数据 339 11.1 XML的定义 339 11.1.1 XML和HTML的差别 340 11.1.2 标记和元素 343 11.1.3 模式和文档类型定义 346 ...

    ASP.NET3.5从入门到精通

    1.6 小结 第 2 章 C# 3.0 程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 第一篇窗口与界面编程 7 2.1.2 C# IDE 的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 ...

    ASP.NET 3.5 开发大全11-15

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

    ASP.NET 3.5 开发大全

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

    ASP.NET 3.5 开发大全1-5

    1.6 小结 第2章 C# 3.0程序设计基础 2.1 C#程序 2.1.1 C#程序的结构 2.1.2 C# IDE的代码设置 2.2 变量 2.2.1 定义 2.2.2 值类型 2.2.3 引用类型 2.3 变量规则 2.3.1 命名规则和命名习惯 2.3.2 声明并初始化变量 ...

Global site tag (gtag.js) - Google Analytics