sqlserver2005使用row_number() over分頁的實(shí)現(xiàn)方法
更新時(shí)間:2011年11月15日 23:03:04 作者:
sqlserver2005使用row_number() over分頁的實(shí)現(xiàn)方法,需要的朋友可以參考下。
語法: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
將會(huì)返回table表
其中有一列名字為 RowNumber, 編號(hào)從1開始
示例:
xlh row_num
1700 1
1500 2
1085 3
710 4
有了row_num 編號(hào)之后是不是很方便分頁呀! 哈哈
只要使用
where RowNumber between
就可以實(shí)現(xiàn)分頁了 呵呵(從此分頁就是這么簡(jiǎn)單)
例子:
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
在當(dāng)前select里面不能采用 RowNumber字段,并且不能使用排序
方式一
select top @pageSize * from company where id not in
(select top @pageSize*(@pageIndex-1) id from company)
方式二ROW_NUMBER()OVER
--ROW_NUMBER() 就是生成一個(gè)有順序的行號(hào),而他生成順序的標(biāo)準(zhǔn),就是后面緊跟的OVER(ORDER BY ID)
--還必須添加OVER語句以便告訴SQL Server你希望怎樣添加行序號(hào)。
select getdate()
select * from company where id in (
--搜索出settable表中所有的編號(hào),也就是company表中的id,這里只不過要得到num(即有順序的編號(hào))
select id from
--搜索出出表中的所有的id,并且新建一列num用來存取排序的編號(hào),并且把這張表賦值給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中,要實(shí)現(xiàn)顯示某一頁,就返回那一頁數(shù)據(jù)的效果的方法實(shí)在不盡人意.網(wǎng)上很多通用的分頁存儲(chǔ)過程,但看著就頭大.如果使用我前面提到的使用in,not in,top來進(jìn)行返回特定頁,特殊的限制又會(huì)比較多(比如ID要遞增).現(xiàn)在Sql Server 2005中提供了一個(gè)函數(shù)ROW_NUMBER(),可以使自定義分頁變得簡(jiǎn)單許多.
我們先來看看ROW_NUMBER()是干什么的.執(zhí)行下面這段SQL語句:
SELECT [ReportID],[UserName], [ReportID],
[TimeStart], [TimeEnd],ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM [ExecutionLog]
很簡(jiǎn)單,ROW_NUMBER() 就是生成一個(gè)順序的行號(hào),而他生成順序的標(biāo)準(zhǔn),就是后面緊跟的OVER(ORDER BY ReportID).現(xiàn)在,你看到了自定義分頁的影子了嗎?:)下面,我們看看怎么具體應(yīng)用這個(gè)RowNo進(jìn)行分頁.
現(xiàn)在,假設(shè)我每一頁的數(shù)據(jù)是10條,我們就可以使用如下所示的SQL語句返回指定頁的數(shù)據(jù):
@"
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就是我們需要數(shù)據(jù)的頁數(shù).很簡(jiǎn)單,不是嗎?并且,這種方式幾乎沒有什么限制,因?yàn)樗喈?dāng)于對(duì)于任何檢索,都生成了一個(gè)新的排序列.我們就可以使用該列進(jìn)行自定義分頁.
================
下面舉個(gè)例子:
ROW_NUMBER函數(shù)
SQL Server2005為我們引入了一個(gè)ROW_NUMBER函數(shù)。你是否曾經(jīng)需要為你的查詢結(jié)果集做行序號(hào)?你有時(shí)會(huì)發(fā)現(xiàn)能夠?yàn)樾凶鲂蛱?hào)是一件很有用的事情。從前,你不得不作棘手的事,像創(chuàng)建一個(gè)有序號(hào)列的臨時(shí)表,然后把你的SELECT結(jié)果插入到這個(gè)臨時(shí)表中。現(xiàn)在,用ROW_NUMBER函數(shù),你就可以獲得添加在你的結(jié)果集的增加列中的行序號(hào)。為了獲得行序號(hào),你只要簡(jiǎn)單的將ROW_NUMBER函數(shù)作為一列添加進(jìn)你的SELECT語句中。你還必須添加OVER語句以便告訴SQL Server你希望怎樣添加行序號(hào)。
SELECT ROW_NUMBER() OVER(ORDER BY employee_id) AS 'Row Number', * from
dbo.employee
結(jié)果
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
這個(gè)查詢返回所有的雇員和一個(gè)顯示每條記錄在哪一行的一個(gè)序號(hào)。OVER語句使SQL Server基于employee_id列增加行序號(hào)。換句話說,產(chǎn)生了行序號(hào),就好像數(shù)據(jù)按employee_id做了排序。這是很重要的一點(diǎn),因?yàn)槟闳匀豢梢愿淖僑ELECT的排序順序。以下面的查詢?yōu)槔?
SELECT ROW_NUMBER() OVER(ORDER BY employee_id) AS 'Row Number', * from
dbo.employee
ORDER BY soc_sec
結(jié)果
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
注意第二個(gè)結(jié)果集數(shù)據(jù)是按社會(huì)安全編號(hào)來排序的,但是行號(hào)仍然創(chuàng)建得好像數(shù)據(jù)是按employee_id排序的。
-------------------------------分頁存儲(chǔ)過程
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值返回記錄總數(shù), 非 0 值則返回記錄
)
AS
begin tran
IF @DoCount=0
Goto GetCount
Else
Goto GetSearch
GetCount: --返回記錄總數(shù)
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
例子:
復(fù)制代碼 代碼如下:
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
將會(huì)返回table表
其中有一列名字為 RowNumber, 編號(hào)從1開始
示例:
xlh row_num
1700 1
1500 2
1085 3
710 4
有了row_num 編號(hào)之后是不是很方便分頁呀! 哈哈
只要使用
where RowNumber between
就可以實(shí)現(xiàn)分頁了 呵呵(從此分頁就是這么簡(jiǎn)單)
例子:
復(fù)制代碼 代碼如下:
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
在當(dāng)前select里面不能采用 RowNumber字段,并且不能使用排序
方式一
select top @pageSize * from company where id not in
(select top @pageSize*(@pageIndex-1) id from company)
方式二ROW_NUMBER()OVER
--ROW_NUMBER() 就是生成一個(gè)有順序的行號(hào),而他生成順序的標(biāo)準(zhǔn),就是后面緊跟的OVER(ORDER BY ID)
--還必須添加OVER語句以便告訴SQL Server你希望怎樣添加行序號(hào)。
select getdate()
select * from company where id in (
--搜索出settable表中所有的編號(hào),也就是company表中的id,這里只不過要得到num(即有順序的編號(hào))
select id from
--搜索出出表中的所有的id,并且新建一列num用來存取排序的編號(hào),并且把這張表賦值給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中,要實(shí)現(xiàn)顯示某一頁,就返回那一頁數(shù)據(jù)的效果的方法實(shí)在不盡人意.網(wǎng)上很多通用的分頁存儲(chǔ)過程,但看著就頭大.如果使用我前面提到的使用in,not in,top來進(jìn)行返回特定頁,特殊的限制又會(huì)比較多(比如ID要遞增).現(xiàn)在Sql Server 2005中提供了一個(gè)函數(shù)ROW_NUMBER(),可以使自定義分頁變得簡(jiǎn)單許多.
我們先來看看ROW_NUMBER()是干什么的.執(zhí)行下面這段SQL語句:
SELECT [ReportID],[UserName], [ReportID],
[TimeStart], [TimeEnd],ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM [ExecutionLog]
很簡(jiǎn)單,ROW_NUMBER() 就是生成一個(gè)順序的行號(hào),而他生成順序的標(biāo)準(zhǔn),就是后面緊跟的OVER(ORDER BY ReportID).現(xiàn)在,你看到了自定義分頁的影子了嗎?:)下面,我們看看怎么具體應(yīng)用這個(gè)RowNo進(jìn)行分頁.
現(xiàn)在,假設(shè)我每一頁的數(shù)據(jù)是10條,我們就可以使用如下所示的SQL語句返回指定頁的數(shù)據(jù):
@"
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就是我們需要數(shù)據(jù)的頁數(shù).很簡(jiǎn)單,不是嗎?并且,這種方式幾乎沒有什么限制,因?yàn)樗喈?dāng)于對(duì)于任何檢索,都生成了一個(gè)新的排序列.我們就可以使用該列進(jìn)行自定義分頁.
================
下面舉個(gè)例子:
ROW_NUMBER函數(shù)
SQL Server2005為我們引入了一個(gè)ROW_NUMBER函數(shù)。你是否曾經(jīng)需要為你的查詢結(jié)果集做行序號(hào)?你有時(shí)會(huì)發(fā)現(xiàn)能夠?yàn)樾凶鲂蛱?hào)是一件很有用的事情。從前,你不得不作棘手的事,像創(chuàng)建一個(gè)有序號(hào)列的臨時(shí)表,然后把你的SELECT結(jié)果插入到這個(gè)臨時(shí)表中。現(xiàn)在,用ROW_NUMBER函數(shù),你就可以獲得添加在你的結(jié)果集的增加列中的行序號(hào)。為了獲得行序號(hào),你只要簡(jiǎn)單的將ROW_NUMBER函數(shù)作為一列添加進(jìn)你的SELECT語句中。你還必須添加OVER語句以便告訴SQL Server你希望怎樣添加行序號(hào)。
SELECT ROW_NUMBER() OVER(ORDER BY employee_id) AS 'Row Number', * from
dbo.employee
結(jié)果
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
這個(gè)查詢返回所有的雇員和一個(gè)顯示每條記錄在哪一行的一個(gè)序號(hào)。OVER語句使SQL Server基于employee_id列增加行序號(hào)。換句話說,產(chǎn)生了行序號(hào),就好像數(shù)據(jù)按employee_id做了排序。這是很重要的一點(diǎn),因?yàn)槟闳匀豢梢愿淖僑ELECT的排序順序。以下面的查詢?yōu)槔?
SELECT ROW_NUMBER() OVER(ORDER BY employee_id) AS 'Row Number', * from
dbo.employee
ORDER BY soc_sec
結(jié)果
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
注意第二個(gè)結(jié)果集數(shù)據(jù)是按社會(huì)安全編號(hào)來排序的,但是行號(hào)仍然創(chuàng)建得好像數(shù)據(jù)是按employee_id排序的。
-------------------------------分頁存儲(chǔ)過程
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值返回記錄總數(shù), 非 0 值則返回記錄
)
AS
begin tran
IF @DoCount=0
Goto GetCount
Else
Goto GetSearch
GetCount: --返回記錄總數(shù)
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 server分頁的4種方法示例(很全面)
- SQL Server中row_number分頁查詢的用法詳解
- SQL Server 分頁編號(hào)的另一種方式【推薦】
- SQL Server 在分頁獲取數(shù)據(jù)的同時(shí)獲取到總記錄數(shù)
- 基于sqlserver的四種分頁方式總結(jié)
- sqlserver分頁查詢處理方法小結(jié)
- SQLServer存儲(chǔ)過程實(shí)現(xiàn)單條件分頁
- sql server實(shí)現(xiàn)分頁的方法實(shí)例分析
- 五種SQL Server分頁存儲(chǔ)過程的方法及性能比較
- SQL SERVER 2008 中三種分頁方法與比較
- 高效的SQLSERVER分頁查詢(推薦)
- SQL Server實(shí)現(xiàn)分頁方法介紹
相關(guān)文章
SQL Server 移動(dòng)系統(tǒng)數(shù)據(jù)庫
SQL Server中系統(tǒng)數(shù)據(jù)庫有master、model、msdb、tempdb四個(gè)數(shù)據(jù)庫,對(duì)于一般的庫,我們要移動(dòng)他們的位置,只需分離附加即可,而這些系統(tǒng)數(shù)據(jù)庫沒有分離的選項(xiàng),那要怎么移動(dòng)他們呢?2016-05-05sqlserver 存儲(chǔ)過程中的top+變量使用分析(downmoon)
sqlserver 存儲(chǔ)過程中的top+變量使用分析(downmoon) ,需要的朋友可以參考下。2011-05-05Sql實(shí)現(xiàn)行列轉(zhuǎn)換方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù)
pivot和unpivot實(shí)現(xiàn)行列轉(zhuǎn)換,這極大的方便了我們存儲(chǔ)數(shù)據(jù)和呈現(xiàn)數(shù)據(jù),下面對(duì)這兩個(gè)關(guān)鍵字進(jìn)行分析,結(jié)合實(shí)例講解如何存儲(chǔ)數(shù)據(jù),如何呈現(xiàn)數(shù)據(jù)2013-08-08Sql server 備份還原后出現(xiàn) 受限制用戶 問題
怎么解決Sql Server 2005數(shù)據(jù)庫備份還原后出現(xiàn)“受限制用戶”,這是大家在數(shù)據(jù)庫備份還原后經(jīng)常遇到的問題,我們今天就來探討下.2020-03-03winXP系統(tǒng)安裝SQLServer2005開發(fā)版具體過程與注意問題
XP系統(tǒng)系統(tǒng)只能安裝SQL Server 2005開發(fā)版,可以到到網(wǎng)上下載SQL Server 2005開發(fā)版的iso文件2009-08-08SqlServer 2005 T-SQL Query 學(xué)習(xí)筆記(4)
作者他很喜歡建立數(shù)字輔助表(即是1-N的數(shù)字按順序組成的表),關(guān)于如何建立這些輔助表,然后他給了一些例子,這些例子很有代表性。2010-02-02sql2005創(chuàng)建遠(yuǎn)程登錄帳戶的sql語句
有時(shí)候我們需要?jiǎng)?chuàng)建遠(yuǎn)程登錄賬號(hào),這里簡(jiǎn)單分享下,方便需要的朋友2013-04-04