語法
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) <BR>
例子:
復制代碼 代碼如下:
select * from (
select * ROW_NUMBER() OVER(Order by aCreateTime DESC ) AS RowNumber from table_name as a
) as b
where RowNumber BETWEEN and
將會返回table表
其中有一列名字為 RowNumber
編號從
開始
示例
xlh row_num
有了row_num 編號之後是不是很方便分頁呀! 哈哈
只要使用
where RowNumber between
就可以實現分頁了 呵呵(從此分頁就是這麼簡單)
例子:
復制代碼 代碼如下:
select *
from(
select ROW_NUMBER() OVER( ORDER BY PSIOCreateTime DESC ) AS RowNumberPSIOSeqNoPSIOCreateTime from dboOutput PSIO
inner join Album PPA on PSIOPPAID=PPAPPAID
where PPAPPAID=PPAID=PPAID
) T where RowNumber BETWEEN and order by
在當前select裡面不能采用 RowNumber字段
並且不能使用排序
方式一
select top @pageSize * from company where id not in
(select top @pageSize*(@pageIndex
) 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
)*@pageSize+
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
)*@pageSize+
AND @pageIndex*@pageSize
ORDER BY id asc
Sql Server
的自定義分頁
但是在sql server
中
要實現顯示某一頁
就返回那一頁數據的效果的方法實在不盡人意
網上很多通用的分頁存儲過程
但看著就頭大
如果使用我前面提到的使用in
not in
top來進行返回特定頁
特殊的限制又會比較多(比如ID要遞增)
現在Sql Server
中提供了一個函數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進行分頁
現在
假設我每一頁的數據是
條
我們就可以使用如下所示的SQL語句返回指定頁的數據:
@
SELECT TOP
*
FROM
(
SELECT top
[InstanceName]
[UserName]
[ReportID]
[TimeStart]
[TimeEnd]
ROW_NUMBER() OVER (ORDER BY ReportID) AS RowNo
FROM [ExecutionLog]
) AS A
WHERE RowNo >
+ pageIndex*
pageIndex就是我們需要數據的頁數
很簡單
不是嗎?並且
這種方式幾乎沒有什麼限制
因為他相當於對於任何檢索
都生成了一個新的排序列
我們就可以使用該列進行自定義分頁
================
下面舉個例子:
ROW_NUMBER函數
SQL Server
為我們引入了一個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
Tim Jones
Rob Kinkad
Jim Miller
Joe Roberts
這個查詢返回所有的雇員和一個顯示每條記錄在哪一行的一個序號
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
Tim Jones
Jim Miller
Rob Kinkad
Joe Roberts
注意第二個結果集數據是按社會安全編號來排序的
但是行號仍然創建得好像數據是按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
end
分頁
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo]
[Deer_Page]
(
@startIndex INT
@pageSize INT
@strSql varchar(
)
查詢條件
@TableName varchar(
)
@DoCount AS bit=
值返回記錄總數
非
值則返回記錄
)
AS
begin tran
IF @DoCount=
Goto GetCount
Else
Goto GetSearch
GetCount:
返回記錄總數
DECLARE @SearchSql AS Nvarchar(
)
SET @SearchSql=
SELECT Count(*) AS Total FROM
+@TableName+
WHERE IntReserve
=
exec sp_executesql @SearchSql
print @SearchSql
COMMIT TRAN
return
GetSearch:
返回記錄
DECLARE @SqlQuery varchar(
)
SET @SqlQuery=
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY O
ID ) Row
* from
+@TableName+
O Where IntReserve
=
) as temp
WHERE Row BETWEEN
+cast(@startIndex as varchar) +
and
+cast(@startIndex+@pageSize
as varchar)+ @strsql
print @SqlQuery
execute(@SqlQuery)
COMMIT TRAN
From:http://tw.wingwit.com/Article/program/SQLServer/201405/30728.html