使用数据库分页返回用户数据有如下好处:
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. 【Win10应用开发】协议-下篇:自定义多个协议

    前面介绍了如何为应用程序自定义协议,于是有朋友会问,我希望为我的应用注册多个协议,不同的协议处理不同的事情,能吗?答案是能的. 方法主要在配置清单文件上,这里我给出一个例子,示例应用将注册两个协议,分 ...

  2. 【转】Linq Group by

    http://www.cnblogs.com/death029/archive/2011/07/23/2114877.html 1.简单形式: var q = from p in db.Product ...

  3. android ANR产生原因和解决办法

    转自http://blog.sina.com.cn/s/blog_618199e60101kvbl.html ANR (Application Not Responding) ANR定义:在Andro ...

  4. 浅谈async、await关键字 => 深谈async、await关键字

    前言 之前写过有关异步的文章,对这方面一直比较弱,感觉还是不太理解,于是会花点时间去好好学习这一块,我们由浅入深,文中若有叙述不稳妥之处,还请批评指正. 话题 (1)是不是将方法用async关键字标识 ...

  5. hdu4833 Best Financing(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4833 这道题目关键的思想是从后往前dp,dp[i]表示在第i处投资xi能获得的最大收益,其中xi表示从 ...

  6. 关于MVC EF架构及Repository模式的一点心得

    一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...

  7. IOS中block和代理

    从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...

  8. 韩国"被申遗" (转自果壳)

    "被申遗"不是指"没申遗",而是全都经过了中国人重新包装. 近日,有报道称韩国计划将火炕申报世界遗产,联系近年来韩国多起"申遗事件",国内网 ...

  9. jdk线程池主要原理

    本文转自:http://blog.csdn.net/linchengzhi/article/details/7567397 正常创建一个线程的时候,我们是这样的:new thread(Runnable ...

  10. 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了

    写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...