MSSQL 分页
使用数据库分页返回用户数据有如下好处:
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 分页的更多相关文章
- mssql分页原理及效率分析
下面是常用的分页,及其分页效率分析. 1.分页方案一:(利用Not In和SELECT TOP分页) 语句形式: SELECT TOP 10 * FROM TestTable WHERE (ID NO ...
- mssql分页存储过程
本文转自百度文库http://wenku.baidu.com/view/8f6ec149fe4733687e21aa72.html 必须有主键 原代码 Codeuse users go if exis ...
- PHP MSSQL 分页实例(刷新)
<?php/* '页面说明:*/ $link=mssql_connect("MYSQL2005","sa","123456") or ...
- asp.net mvc4+mysql做一个简单分页组件(部分视图)
在开始做mysql分页功能组件前,便设定的是要有一定可复用性.先在项目里Views文件夹下右键新建名为_PaginationComponent.cshtml,这里html及css我采用的bootstr ...
- mssql sqlserver存储过程专题
MSSQL存储过程简介及创建方式 mssql_DB_存储过程类型简介 MSSQL sql存储过程创建简介及应用举例 MSSQL SQl server 2008 CLR 存储过程创建举例 MSSQL ...
- golang xorm MSSQL where查询案例
xorm官方中文文档 参考 http://xorm.io/docs/ 以sqlserver为例 先初始化连接等... engine, err := xorm.NewEngine("mssql ...
- ASP.NET MVC+JQueryEasyUI1.4+ADO.NET Demo
1.JQueryEasyUI使用 JQuery EasyUI中文官网:http://www.jeasyui.net/ JQuery EasyUI中文官网下载地址:http://www.jeasyui. ...
- atitit。mssql sql server 转换mysql 及 分页sql ast的搭建
atitit.mssql sql server 转换mysql 及 分页sql ast的搭建 1. 主要的的转换::函数的转换,分页的转换 1 2. 思路::mssql sql >>as ...
- ASP.NET和MSSQL高性能分页
首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录: set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ======= ...
随机推荐
- Java 线程 — ThreadPoolExecutor
线程池 线程池处理流程 核心线程池:创建新线程执行任务,需要获取全局锁 队列:将新来的任务加入队列 线程池:大于corePoolSize,并且队列已满,小于maxPoolSize,创建新的worker ...
- mysql导入导出sql文件
window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql2. ...
- js的作业题
<script type="text/javascript"> //var a=3; //switch(a) // { // case 1: // alert(&quo ...
- HTTP的RST包与WinHttp延迟关闭TCP连接
一.RST包也常见于断开TCP连接 几个月前用wireshark抓HTTP包发现有的网络通信在结束的时候没有使用四次握手,而是直接使用RST包.如: 在TCP协议中RST表示复位,用来异常的关闭连接 ...
- Markdown编辑器入门
欢迎使用博客园的Markdown编辑器 前言 今天早上起来在Ubuntu下操作,所以不能使用Windows Live Writer.所以就直接使用博客园的后台编辑器,开始以为博客园出错了,怎么编辑都没 ...
- 安装ClouderaManager以及使用ClouderaManager安装分布式集群的若干细节
目录 前言 整体介绍 分步安装介绍 总结 一.前言 周末干了近四十个小时中间只休息了五个小时终于成功安装了ClouderaManager以及分布式集群,其中各种辛酸无以言表,唯有泪两行. ...
- Stackoverflow/dapper的Dapper-Extensions用法(一)
Dapper-Extensions Dapper Extensions is a small library that complements Dapper by adding basic CRUD ...
- Machine Learning
Recently, I am studying Maching Learning which is our course. My English is not good but this course ...
- css常用的特效代码
一.网页变灰的代码:a) 网页变灰色<head>加到这里</head><style type="text/css">html {FILTER: ...
- 何谓Restful
引言 用过ASP.NET WebApi2.0, 上次去面试被问到什么是Restful ,一时间竟不知道从何说起,所以搜集资料,做个备注,有时间好多来看看加深理解. 什么是Restful 一种软件架构风 ...