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 -- ======= ...
随机推荐
- Android开发-之认识palette
Android开发中,Google工程师已经给我们封装好了很多的按钮,使得我们在开发中非常的方便和便捷. 那么今天就来认识一下常用的按钮,那么在之前的课程中我已经详细讲过了Button按钮,那么这里就 ...
- 谈谈php里的DAO Model AR
这次要谈的3个关键字:DAO.Model.AR,是我们在做web应用时常见的几个概念,也被称作设计模式(design pattern),先简单看看它们的全拼和中文: DAO:Data Access O ...
- LINQ系列:Linq to Object转换操作符
转换是指将输入对象的类型转变为序列的动作. 1. AsEnumerable AsEnumerable操作符将查询的输入以IEnumberable(T)类型返回. 2. Cast Cast操作符将IEn ...
- python统计某一个进程名所占用的内存
设计思路: 通过python,执行cmd中tasklist命令,获取要统计的进程的相关信息:通过正则表达式,查找出进程名称.进程pid.内存使用,然后打印出来. 作为pythoner,有时候需要统计p ...
- 安装ClouderaManager以及使用ClouderaManager安装分布式集群的若干细节
目录 前言 整体介绍 分步安装介绍 总结 一.前言 周末干了近四十个小时中间只休息了五个小时终于成功安装了ClouderaManager以及分布式集群,其中各种辛酸无以言表,唯有泪两行. ...
- 不行,受不了了,我要记录下这个 bug
我们在使用 java 中使用线程 Thread 的时候,在 run(){ } 里面的如果要传递参数给函数,一般,编译系统都会提示我们,要将这个参数尽可能地设置为 final,即常量,一旦定义就不能再 ...
- 5分钟学会使用Less预编译器
5分钟学会使用Less预编译器 Less是什么? LESS CSS是一种动态样式语言,属于CSS预处理语言的一种,它使用类似CSS的语法为CSS赋予了动态语言的特性,如变量.继承.运算.函数等,更方便 ...
- 小div布局之卡片堆叠(card-stacking)
前端的页面布局和各种效果真是让人眼花缭乱,公司的设计师恨不得在一个网站上把前端的布局和样式效果都用一遍. 如何实现下面这种布局效果?我给这种布局效果起了个名字,叫做小div布局之卡片堆叠.然后我百度了 ...
- ASP.NET程序开发范例宝典
在整理资料时发现一些非常有用的资料源码尤其是初学者,大部分是平时用到的知识点,可以参考其实现方法,分享给大家学习,但请不要用于商业用途. 如果对你有用请多多推荐给其他人分享. 点击对应章节标题下载本章 ...
- Ftp上传下载 C#
public class MyFtpClass { private readonly string _destIp; private readonly string _userName; privat ...