`
zzc1684
  • 浏览: 1190972 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

sqlserver2005使用row_number() over分页的实现方法

阅读更多

sqlserver2005使用row_number() over分页的实现方法,需要的朋友可以参考下。
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) <BR>
例子:
复制代码 代码如下:
select * from (
    select *, ROW_NUMBER() OVER(Order by a.CreateTime DESC ) AS RowNumber from table_name as a
  ) as b
  where RowNumber BETWEEN 1 and 5

将会返回table表

其中有一列名字为 RowNumber, 编号从1开始

示例:
xlh row_num
1700 1
1500 2
1085 3
710 4

有了row_num 编号之后是不是很方便分页呀! 哈哈

只要使用
where RowNumber between
就可以实现分页了 呵呵(从此分页就是这么简单)

例子:
复制代码 代码如下:
select *
from(
select ROW_NUMBER() OVER( ORDER BY PSIO.CreateTime DESC ) AS RowNumber,PSIO.SeqNo,PSIO.CreateTime from dbo.Output PSIO
inner join Album PPA on PSIO.PPAID=PPA.PPAID
where PPA.PPAID=103--PPAID=3.PPAID
) T where RowNumber BETWEEN 1 and 5 order by 1

在当前select里面不能采用 RowNumber字段,并且不能使用排序

方式一
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

详细出处参考:http://www.jb51.net/article/28919.htm

分享到:
评论

相关推荐

    SQL Server使用row_number分页的实现方法

    本文为大家分享了SQL Server使用row_number分页的实现方法,供大家参考,具体内容如下 1、首先是 select ROW_NUMBER() over(order by id asc) as ‘rowNumber’, * from table1 生成带序号的集合 2、再查询该集合的 ...

    sqlServer使用ROW_NUMBER时不排序的解决方法

    设置sqlServer使用ROW_NUMBER时不排序 –1.看到NHibernate是这样写的分页,感觉写起来比较容易理解(应该不会有效率问题吧?) –with只是定一个别名? [sql] with query as (select ROW_NUMBER() over(order by ...

    SQL2005利用ROW_NUMBER() OVER实现分页功能

    SQL2005利用ROW_NUMBER() OVER实现分页功能,需要的朋友可以参考下

    SQL Server中row_number分页查询的用法详解

    在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号。 ROW_NUMBER() 说明:返回结果集分区内行的序列号,每个分区的第一行从...

    解析数据库分页的两种方法对比(row_number()over()和top的对比)

    本篇文章是对数据库分页的两种方法对比(row_number()over()和top的对比)进行了详细的分析介绍,需要的朋友参考下

    SQL Server 在分页获取数据的同时获取到总记录数

    SQL Server 获取数据的总记录数,有两种方式: 1.先分页获取数据,然后再查询一遍数据库获取到总数量 2.使用count(1) over()获取总记录数量 SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY Id DESC) rn, ...

    sql server2005 分页存储过程

    SELECT ROW_NUMBER() OVER(ORDER BY ' + @orderBy + ') AS row, * FROM ' + @datasrc + ' WHERE ' + @filter + ' ) AS tbl WHERE row &gt; ' + CONVERT(varchar(9), @lbound) + ' AND row (varchar(9), @ubound)...

    sqlserver 三种分页方式性能比较[图文]

    CreateTime列建立聚集索引 第一种,sqlserver2005特有的分页语法 代码如下: declare @page int declare @pagesize int set @page = 2 set @pagesize = 12 SET STATISTICS IO on SELECT a.* FROM ( SELECT ROW_...

    SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)

    SELECT * FROM #1 B.SQL 2005提供一个很好用的函数row_number(), 可以直接用来显示行号,当然也可以使用SQL 2000的identity SELECT row_number()over(ORDER BY DataID) AS ROWNUM, [DataID] FRO

    基于sqlserver的四种分页方式总结

    第一种:ROW_NUMBER() OVER()方式 select * from (  select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId from ArtistModels  ) as b where RowId between 10 and 20 —where RowId BETWEEN 当前页数-1*...

    SQL Server 分页编号的另一种方式【推荐】

    今天看书讲T-SQL,看到了UNBOUNDED PRECEDING,就想比对下ROW_NUMBER()的运行速度。 sql及相关的结果如下,数据库中的数据有5W+。 ROW_NUMBER(): SET STATISTICS TIME ON SELECT ROW_NUMBER() OVER(ORDER BY Id ...

    UserPageControlDemo.rar

    文件中包含了数据库建立测试数据表的sql脚本,本例使用的是SQLServer2008 这个建表脚本可以用在SQLServer2008/2008R2上查询的脚本在程序中可以看到 包括ROW_NUMBER() OVER(),COUNT() OVER()查询Rn和总数据个数的写法...

    sqlserver存储过程

    ---创建数据库 create database CRM; --删除数据库 drop database CRM; --创建一个表 if exists(select * from sysobjects where name='... select row_number() over(order by Id) as rowId, * from Users ) temp ...

    sql2005全文检索.doc

    内容摘要:本文提供了网站如何设计和实现基于SQL Server 2005的全文检索实例,希望能对正在使用SQL Server 2005构建网站搜索的同仁有所裨益。 一、前言 “人类失去搜索,世界将会怎样?”,同样,很难想象一个拥有极...

    SQL分页查询方式汇总

    需求:查询表dbo.Message,每页...2:BETWEEN * AND * , Row_Number() OVER(ORDER BY *) AS rowNum SELECT *,ROW_NUMBER() OVER(ORDER BY Code) AS rowNum INTO #a FROM dbo.Message SELECT * FROM #a WHERE rowNum BE

    SQL2005 大数据量检索的分页

    @StartIndex为当前页起始序号,@EndIndex为当前页结束记录序号,可以直接作为参数输入,也可以通过输入PageSize和PageIndex计算得出 代码如下:select * from ( select *,row_number() over(order by OrderColumn) as...

    sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】

    代码如下: –代码一DECLARE @cc INT SELECT NewsId,ROW_NUMBER() OVER(ORDER BY SortNum DESC) AS RowIndex INTO #tb FROM news WITH(NOLOCK) WHERE NewsTypeId=@NewsTypeId AND IsShow=1 SET @cc = @@ROWCOUNT ...

    pageshuoming

    1) * @PageSize + 1 SET @MaxPage = @MinPage + @PageSize BEGIN SELECT * FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY SoftID DESC) AS RowNumber FROM V_SoftCategoryAndSoftInfo ) AS A ...

Global site tag (gtag.js) - Google Analytics