sql语句分页多种方式
sql语句分页多种方式ROW_NUMBER()OVER
方式一 select top @pageSize * from company where id not in (select top @pageSize*(@pageIndex-1) id from company) 方式二ROW_NUMBER()OVER --ROW_NUMBER() 就是生成一个有顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ID) --还必须添加OVER语句以便告诉SQL Server你希望怎样添加行序号。 select getdate() select * from company where id in ( --搜索出settable表中所有的编号,也就是company表中的id,这里只不过要得到num(即有顺序的编号) select id from --搜索出出表中的所有的id,并且新建一列num用来存取排序的编号,并且把这张表赋值给settable (select id,row_number() over (order by id) as num from company) as settable --添加搜索条件页索引和页大小 where num between (@pageIndex-1)*@pageSize+1 and @pageIndex*@pageSize) select getdate() 方式三 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY id asc) AS rownum, id FROM company ) AS D WHERE rownum BETWEEN (@pageIndex-1)*@pageSize+1 AND @pageIndex*@pageSize ORDER BY id asc Sql Server 2000的自定义分页,但是在sql server 2000中,要实现显示某一页,就返回那一页数据的效果的方法实在不尽人意.网上很多通用的分页存储过程,但看着就头大.如果使用我前面提到的使用in,not in,top来进行返回特定页,特殊的限制又会比较多(比如ID要递增).现在Sql Server 2005中提供了一个函数ROW_NUMBER(),可以使自定义分页变得简单许多. 我们先来看看ROW_NUMBER()是干什么的.执行下面这段SQL语句: SELECT [ReportID],[UserName], [ReportID], [TimeStart], [TimeEnd],ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo FROM [ExecutionLog] 很简单,ROW_NUMBER() 就是生成一个顺序的行号,而他生成顺序的标准,就是后面紧跟的OVER(ORDER BY ReportID).现在,你看到了自定义分页的影子了吗?:)下面,我们看看怎么具体应用这个RowNo进行分页. 现在,假设我每一页的数据是10条,我们就可以使用如下所示的SQL语句返回指定页的数据: @" SELECT TOP 10 * FROM ( SELECT top 10 [InstanceName], [UserName], [ReportID], [TimeStart], [TimeEnd],ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo FROM [ExecutionLog] ) AS A WHERE RowNo > " + pageIndex*10 pageIndex就是我们需要数据的页数.很简单,不是吗?并且,这种方式几乎没有什么限制,因为他相当于对于任何检索,都生成了一个新的排序列.我们就可以使用该列进行自定义分页. ================ 下面举个例子: ROW_NUMBER函数 SQL Server2005为我们引入了一个ROW_NUMBER函数。你是否曾经需要为你的查询结果集做行序号?你有时会发现能够为行做序号是一件很有用的事情。从前,你不得不作棘手的事,像创建一个有序号列的临时表,然后把你的SELECT结果插入到这个临时表中。现在,用ROW_NUMBER函数,你就可以获得添加在你的结果集的增加列中的行序号。为了获得行序号,你只要简单的将ROW_NUMBER函数作为一列添加进你的SELECT语句中。你还必须添加OVER语句以便告诉SQL Server你希望怎样添加行序号。 SELECT ROW_NUMBER() OVER(ORDER BY employee_id) AS 'Row Number', * from dbo.employee 结果 Row Number employee_id Firstname Lastname soc_sec 1 5623222 Tim Jones 123-65-8745 2 5632111 Rob Kinkad 456-69-8754 3 6365666 Jim Miller 236-56-8989 4 7563333 Joe Roberts 564-89-5555 这个查询返回所有的雇员和一个显示每条记录在哪一行的一个序号。OVER语句使SQL Server基于employee_id列增加行序号。换句话说,产生了行序号,就好像数据按employee_id做了排序。这是很重要的一点,因为你仍然可以改变SELECT的排序顺序。以下面的查询为例: SELECT ROW_NUMBER() OVER(ORDER BY employee_id) AS 'Row Number', * from dbo.employee ORDER BY soc_sec 结果 Row Number employee_id Firstname Lastname soc_sec 1 5623222 Tim Jones 123-65-8745 3 6365666 Jim Miller 236-56-8989 2 5632111 Rob Kinkad 456-69-8754 4 7563333 Joe Roberts 564-89-5555 注意第二个结果集数据是按社会安全编号来排序的,但是行号仍然创建得好像数据是按employee_id排序的。 -------------------------------分页存储过程 IF EXISTS (SELECT * FROM sysobjects where name='P_student') DROP PROCEDURE P_student go CREATE PROCEDURE P_student @startIndex INT, @pageSize INT AS begin WITH studentList AS ( SELECT ROW_NUMBER() OVER (ORDER BY O.stuid ) Row, O.stuid,O.stuname,O.stuage,O.stuinfo from student O) SELECT Row, stuid,stuname,stuage,stuinfo FROM studentList WHERE Row between @startIndex and @startIndex+@pageSize-1 end -------------------分页2--------- set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[Deer_Page] ( @startIndex INT ,@pageSize INT ,@strSql varchar(5000) ---查询条件 ,@TableName varchar(50) ,@DoCount AS bit=1 -- 0值返回记录总数, 非 0 值则返回记录 ) AS begin tran IF @DoCount=0 Goto GetCount Else Goto GetSearch GetCount: --返回记录总数 DECLARE @SearchSql AS Nvarchar(4000) SET @SearchSql= 'SELECT Count(*) AS Total FROM '+@TableName+' WHERE IntReserve1=0' exec sp_executesql @SearchSql --print @SearchSql COMMIT TRAN return GetSearch: --返回记录 DECLARE @SqlQuery varchar(4000) SET @SqlQuery='SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY O.ID ) Row, * from '+@TableName+' O Where IntReserve1=0) as temp WHERE Row BETWEEN '+cast(@startIndex as varchar) +' and '+cast(@startIndex+@pageSize-1 as varchar)+ @strsql ---print @SqlQuery execute(@SqlQuery) COMMIT TRAN |
sql语句分页多种方式的更多相关文章
- sql语句分页多种方式ROW_NUMBER()OVER
sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...
- SQL Server数据库多种方式查找重复记录
摘要:SQL Server是一个关系数据库管理系统,SQL Server数据库的应用是很多的,SQL Server数据库赢得了广大用户的青睐,本文将主要为大家介绍关于SQL Server数据库中查找重 ...
- 3种SQL语句分页写法
在开发中经常会使用到数据分页查询,一般的分页可以直接用SQL语句分页,当然也可以把分页写在存储过程里,下面是三种比较常用的SQL语句分页方法,下面以每页5条数据,查询第3页为例子: 第一种:使用not ...
- 理想中的SQL语句条件拼接方式 (二)
问题以及想要的效果,不重复叙述,如果需要的请先看 理想中的SQL语句条件拼接方式 . 效果 现在有2个类映射数据库的2张表,结构如下: public class User { public int U ...
- Sql Server 优化----SQL语句的执行方式与锁以及阻塞的关系
阻塞原因之一是不同的Session在访问同一张表的时候因为不兼容锁的原因造成的, 当前执行的SQL语句是否被阻塞(或者死锁),不仅跟当前表上的已有的锁有关,也会跟当前执行的SQL语句的执行方式有关 简 ...
- sql语句分页代码
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO alter proc sp_SelectInfomationByKeyWord--创建一个存储过程 - ...
- 理想中的SQL语句条件拼接方式
背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...
- SQL语句 分页实现
1 通过sql实现分页. select top 5 * from judgeorder where id not in (select top 10 id from judgeorder order ...
- Sql语句分页,有待优化
封装成存储过程,但是有点小问题,如果有弄好了的朋友可留言,谢谢了,我只提供了一个模版哈(也是我想实现的功能) create procedure paging_procedure ( @pageInde ...
随机推荐
- Ionic4.x Modal模态对话框以及 Modal 传值
1.Modal 模态对话框简介 官方文档:https://ionicframework.com/docs/api/modal Modal模态对话框主要用于登录注册页面,我们可以把它理解为从页面底部弹出 ...
- angular点击事件和表单事件
<div style="text-align:center"> <h1> Welcome to {{ title }}! </h1> <b ...
- Canvas的flag具体的含义
示例代码: package com.loaderman.customviewdemo; import android.content.Context; import android.graphics. ...
- jar启动脚本shell
#!/bin/bash#这里可替换为你自己的执行程序,其他代码无需更改 APP_NAME=/opt/server/msp/health-api/health-2.0.2.jar#使用说明,用来提示输入 ...
- elasticsearch _search结果解析
kibana中输入:GET /_search 会返回一下结果: { "took": 9, # took:整个搜索请求花费多少毫秒 "timed_out": fa ...
- Linux/CentOS下修改MAC地址
Linux/CentOS下修改MAC地址 摘自:https://blog.csdn.net/qq_33233768/article/details/64906265 2017年03月22日 11:06 ...
- 一百四十六:CMS系统之帖子按照发布时间和评论数量排序
按照不同选项进行排序 视图 @bp.route('/')def index(): board_id = request.args.get('board_id', type=int, default=N ...
- jq删除标签
<script>$(function(){ $("div").remove()})</script>
- Python基础之内置函数(二)
先上一张图,python中内置函数: python官方解释在这:点我点我 继续聊内置函数: callable(object):检查对象是否可被调用,或是否可执行,结果为bool值 def f1(): ...
- 用Dev C++编写第一个C语言程序
不少新同学表示对计算机类专业有些担忧,那么可以趁军训期间提前玩玩. 学校一般使用VS2008进行编程,VS2008功能强大,内容丰富,体积也比较大.如果只关注C语言编程的话,有一个非常轻便的软件Dev ...