使用数据库分页返回用户数据有如下好处:
1、减少服务器磁盘系统地读取压力
2、减少网络流量,减轻网络压力
3、减轻客户端显示数据的压力
4、提高处理效率。

一般而言分页处理分为两种:应用程序中的分页(查询出所有数据)处理和数据库中的分页处理。目前大多数的应用都是在应用程序中借助支持数据分页处理的数据库访问组件(如DataGrid控件)实现分页处理(大部分的分页插件中也是采用的程序分页)。实际上,在数据库中实现分页处理,可以从源头减少数据处理量,效果往往可能更好。

所以我们在需要分页的时候尽量使用数据库分页效果是更好的。

常规的取第n页数据方法为

SELECT TOP PageSize * FROM TableA WHERE Primary_Key NOT IN (SELECT TOP (n-1) * PageSize Primary_Key FROM TableA )  

这样的如果改成存储过程大概是这样的

CREATE PROC up_PageView ( @tableName SYSNAME ,
@colKey NVARCHAR(100) ,
@pageCurrent INT = 1 ,
@pageSize INT = 10 ,
@colShow NVARCHAR(4000) = '' ,
@colOrder NVARCHAR(200) = '' ,
@where NVARCHAR(2000) = '' ,
@pageCount INT OUTPUT )
AS
BEGIN
IF OBJECT_ID(@tableName) IS NULL
BEGIN
RAISERROR('the table is not existing!', 16,1)
RETURN
END
IF ISNULL(@colShow,'') = ''
SET @colShow = '*'
IF ISNULL(@colOrder,'') = ''
SET @colOrder = ''
ELSE
SET @colOrder = 'order by ' + @colOrder
IF ISNULL(@where,'') = ''
SET @where = ''
ELSE
SET @where = 'where ' + @where
DECLARE @sql NVARCHAR(4000)
IF @pageCount IS NULL
BEGIN
SET @sql = 'select @pageCount = count(*) from ' + @tableName + ' ' + @where
EXEC sp_executesql
@sql ,
'@pageCount int output' ,
@pageCount OUTPUT
SET @pageCount = ( @pageCount + @pageSize - 1 ) / @pageSize -- get total pages
END
IF @pageCurrent = 1
BEGIN
SET @sql = N'select top' + N' ' + CONVERT(NVARCHAR(10),@pageSize) + N' ' + @colshow + N' ' + N'from '
+ @tableName + N' ' + @where + N' ' + @colOrder
EXEC (@sql)
END
ELSE
BEGIN
DECLARE @topN INT ,
@topN1 INT
-- set @topN = @pageSize
-- set @topN1 = @pageCurrent * @pageSize
SET @pageCurrent = @pageCurrent * @pageSize
SET @sql = N'select @n = @n - 1, @s = case when @n < ' + CONVERT(NVARCHAR(10),@pageSize)
+ N' then @s + '','' + quotename(@colKey, N'''''''') ' + N'else ''''' + N' end ' + N' from ' + @tableName
+ N' ' + @where
--make query effect only @pageCurrent records
--Query only top @pageCurrent * @pageSize
SET ROWCOUNT @pageCurrent
EXEC sp_executesql
@sql ,
'@n int, @s nvarchar(max) output' ,
@pageCurrent ,
@sql OUTPUT
SET ROWCOUNT 0 --recover to default config
SET @sql = STUFF(@sql,1,1,N'') -- remove the first ','
--exec the query
EXEC (N'select ' + @colShow + N' ' + 'from' + N' ' + @tableName + N' '
+ N'where ' + @colKey + N' in (' + @sql + ')' + @colOrder)
END
END
go

但是这种执行起来效率比较低,这样是把 top n 取大量的数据并缓存起来,在关联元表查询出最终结果。

下面我们采用另一种方法,在 sql server 2005 以后增加了一些新的功能如取得排名或顺序的函数(Rank(), Dense_Rank(), Row_Number()), 利用这些新的功能也能进行分页处理,下面以sql server 2005 自带的数据库AdventureWorks为例结合Row_Number() 实现分页处理:

CREATE PROC up_GetPagen ( @pageSize INT ,
@pageCurrent INT ,
@countPage INT OUTPUT )
AS
BEGIN
SELECT *
FROM (
SELECT ROW_NUMBER () OVER (ORDER BY id) RowNum,* FROM TableA
) TA
WHERE RowNum BETWEEN ( @pageCurrent - 1 ) * @pageSize + 1 AND @pageCurrent * @pageSize
ORDER BY Id --另加一个返回总记录数吧。
SELECT @countPage = COUNT(0)
FROM TableA
END

MSSQL 分页的更多相关文章

  1. mssql分页原理及效率分析

    下面是常用的分页,及其分页效率分析. 1.分页方案一:(利用Not In和SELECT TOP分页) 语句形式: SELECT TOP 10 * FROM TestTable WHERE (ID NO ...

  2. mssql分页存储过程

    本文转自百度文库http://wenku.baidu.com/view/8f6ec149fe4733687e21aa72.html 必须有主键 原代码 Codeuse users go if exis ...

  3. PHP MSSQL 分页实例(刷新)

    <?php/* '页面说明:*/ $link=mssql_connect("MYSQL2005","sa","123456") or ...

  4. asp.net mvc4+mysql做一个简单分页组件(部分视图)

    在开始做mysql分页功能组件前,便设定的是要有一定可复用性.先在项目里Views文件夹下右键新建名为_PaginationComponent.cshtml,这里html及css我采用的bootstr ...

  5. mssql sqlserver存储过程专题

    MSSQL存储过程简介及创建方式 mssql_DB_存储过程类型简介   MSSQL sql存储过程创建简介及应用举例 MSSQL SQl server 2008 CLR 存储过程创建举例 MSSQL ...

  6. golang xorm MSSQL where查询案例

    xorm官方中文文档 参考 http://xorm.io/docs/ 以sqlserver为例 先初始化连接等... engine, err := xorm.NewEngine("mssql ...

  7. ASP.NET MVC+JQueryEasyUI1.4+ADO.NET Demo

    1.JQueryEasyUI使用 JQuery EasyUI中文官网:http://www.jeasyui.net/ JQuery EasyUI中文官网下载地址:http://www.jeasyui. ...

  8. atitit。mssql sql server 转换mysql 及 分页sql ast的搭建

    atitit.mssql sql server 转换mysql  及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...

  9. ASP.NET和MSSQL高性能分页

    首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ======= ...

随机推荐

  1. WCF学习之旅—WCF第二个示例(五)

    二.WCF服务端应用程序 第一步,创建WCF服务应用程序项目 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序.在弹出界面的“名称”对 ...

  2. 移动web app开发必备 - 异步队列 Deferred

    背景 移动web app开发,异步代码是时常的事,比如有常见的异步操作: Ajax(XMLHttpRequest) Image Tag,Script Tag,iframe(原理类似) setTimeo ...

  3. Tomcat报java.lang.OutOfMemoryError: Java heap space错误停止运行如何解决

    最近开发的一个商业项目,部署完成后,经常出现Tomcat挂掉的现象,报的异常是:java.lang.OutOfMemoryError: Java heap space,上网google了一下,了解了一 ...

  4. Android图片缓存之Glide进阶

    前言: 前面学习了Glide的简单使用(Android图片缓存之初识Glide),今天来学习一下Glide稍微复杂一点的使用. 图片缓存相关博客地址: Android图片缓存之Bitmap详解 And ...

  5. VS2015 Enterprise 安装之惊险及收获

    前言 园子早早的就有人安装了VS 2015,自己也按捺不住了,也要赶快尝尝鲜!结果在其安装过程中一个小小的问题却困扰了我一天,这其中多亏了dudu耐心的解答才得以顺利完成,如果你也遇见这个问题,看过这 ...

  6. Html,Css,Dom,javascript细节总结

    最近愈发觉得基础的重要性,细节决定成败,所以希望能够将自己注意到的搜集到的一些关于前端的小细节小知识整理出来,更好的方便自己记忆回顾. 1.在构建网页Html框架时,尽量只给外层标记(即是父标记)定义 ...

  7. PC网站CSS分享

    这里想总结些编写网页的经验,以PC端的为主,前面总结过后台的,今天写些前台的,参考了bootstrap3.3.5.bootstrip2.3.2和模版matrix. 前段时间还写过一篇<前端基础学 ...

  8. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解

    首先我们找到这个类. 这个类有如下的方法: #region Title & meta [Obsolete("Use HtmlTitle")] public IHtmlStr ...

  9. SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题

    数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参 ...

  10. ASP.NET Core中的ActionFilter与DI

    一.简介 前几篇文章都是讲ASP.NET Core MVC中的依赖注入(DI)与扩展点的,也许大家都发现在ASP.NET CORE中所有的组件都是通过依赖注入来扩展的,而且面向一组功能就会有一组接口或 ...