sqlserver分頁
A. sqlSERVER如何實現分頁查詢
寫存儲過程 ..
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER PROCEDURE usp_Province_pagination
@PageSize INT, --每頁的顯示的行數
@AbsolutePage INT, -- 當前頁的頁數
@PageCount INT OUTPUT --總頁數
AS
DECLARE @BeginRecord INT --記錄每此從哪一行開始讀取
DECLARE @RecordCount INT --表中數據的總條數
DECLARE @sql NVARCHAR(1000)
SET @RecordCount = (SELECT count(*) FROM Province)
--表中沒有數據的情況
IF @RecordCount = 0
BEGIN
SET @PageCount = 0
RETURN(0)
END
-- 表中的總條數大於定義的每頁的行數的情況
IF @RecordCount > @PageSize
BEGIN
-- 計算總能分多少頁
SET @PageCount = (@RecordCount + @PageSize - 1)/@PageSize
--當前應該從哪一行開始讀取
SET @BeginRecord = ((@AbsolutePage-1) * @PageSize)
SET @sql = N'SELECT TOP ' + cast(@PageSize AS NVARCHAR(100)) +' ProvinceID, provinceCode, ProvinceName
FROM Province
WHERE ProvinceID NOT IN
(SELECT TOP '+ CAST(@BeginRecord AS NVARCHAR(100)) + ' ProvinceID
FROM Province)'
EXECUTE sp_executesql @sql
END
ELSE -- -- 表中的總條數大於定義的每頁的行數情況
BEGIN
SET @PageCount = 1
SET @SQL = 'SELECT ProvinceID, provinceCode, ProvinceName FROM Province '
EXECUTE sp_executesql @sql
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
B. 資料庫sqlserver如何用存儲過程做分頁
存儲過程:create Procere pname
( @pageIndex int,@pageSize)
as
select * from tableName order by id
offset @pageIndex * pageSize fetch next pageSize rows only
分頁:
sqlserver 在2008之前 使用 top 和 not int top 的方式來做分頁
2008以後使用 row_number() 函數作為分頁關鍵函數
2012使用 offset 1 fetch next 10 rows only
你問了2個問題,你可以優先把視圖,存儲過程,觸發器等弄明白,分頁是查詢,在存儲過程里可以寫復雜的sql文,只是在運行時是預編譯和參數化查詢防止sql注入
C. SQLServer資料庫存儲過程分頁是怎樣的
存儲過程:create Procere pname
( @pageIndex int,@pageSize)
as
select * from tableName order by id
offset @pageIndex * pageSize fetch next pageSize rows only
分頁:
sqlserver 在2008之前 使用 top 和 not int top 的方式來做分頁
2008以後使用 row_number() 函數作為分頁關鍵函數
2012使用 offset 1 fetch next 10 rows only
你問了2個問題,你可以優先把視圖,存儲過程,觸發器等弄明白,分頁是查詢,在存儲過程里可以寫復雜的sql文,只是在運行時是預編譯和參數化查詢防止sql注入
D. sqlserver 聚合 如何分頁
我看沒人回答我再上。
-----------------------------
這個用子查詢就可以了!如果嵌套很多,證明你的資料庫設計很蹩腳。
給你個例子:
----------
SELECT TOP 10
convert(varchar(10),K.ID) as ID,
convert(varchar(20),convert(decimal(18,2),K.SumRealSaleCost)) as SumRealSaleCost,
K.CountRes
from
(
select
ROW_NUMBER() OVER (ORDER BY GetDate()) AS ID,
(sum(M.Sale) over()-sum(M.ReturnSaleCost) over()) as SumRealSaleCost,
count(*) over() as CountRes
from
(
---這里你愛用什麼聚合函數就用什麼聚合函數,我只用了一個簡單的子查詢而已!
select
A.Sale,
A.ReturnSaleCost
from ProctStore A
) M
) K
where K.ID >?
--這個排序最好和分頁函數一致。
ORDER BY K.Sale DESC
--------------------
最外層為類型轉化層
中間是數據邏輯層
最內層就是集合構建層
我這種寫法很多人不理解,本人原創。你網路不到!
---------------------
如果LZ資料庫有功底的話,加入我的團隊吧!資料庫聚賢庄
E. 幾種常見SQL分頁方式效率比較,一帖子
sqlserver分頁 第一種分頁方法 需用到的參數: pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 select count (*) from 表名 totalPages 總頁數 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 計算前pages 條數據 pages= pageSize*(pageNumber-1) SQL語句: select top pageSize * from 表名 where id not in (select top pages id from 表名 order by id) order by id 第二種分頁方法 pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 pages=pageSize*(pageNumber-1)+1 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t ) mysql分頁 需用到的參數: pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 select count (*) from 表名 totalPages 總頁數 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 pages 起始位置 pages= pageSize*(pageNumber-1) SQL語句: select * from 表名 limit pages, pageSize; mysql 分頁依賴於關鍵字 limit 它需兩個參數:起始位置和pageSize 起始位置=頁大小*(頁數-1) 起始位置=pageSize*(pageNumber -1) oracle分頁 pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 totalRecouds 表中的總記錄數 select count (*) from 表名 totalPages 總頁數 totalPages=totalRecouds%pageSize==0?totalRecouds/pageSize:totalRecouds/pageSize+1 startPage 起始位置 startPage= pageSize*(pageNumber-1)+1 endPage=startPage+pageSize SQL語句 select a.* from ( select rownum num ,t.* from 表名 t where 某列=某值 order by id asc )a where a.num>=startPage and a.num<endPage db2分頁 int startPage=1 //起始頁 int endPage; //終止頁 int pageSize=5; //頁大小 int pageNumber=1 //請求頁 startPage=(pageNumber-1)*pageSize+1 endPage=(startPage+pageSize); SQL語句 select * from (select 欄位1,欄位2,欄位3,欄位4,欄位5,rownumber() over(order by 排序欄位 asc ) as rowid from 表名 )as a where a.rowid >= startPage AND a.rowid <endPage access分頁 pageSize 每頁顯示多少條數據 pageNumber 頁數 從客戶端傳來 pages=pageSize*(pageNumber-1)+1 SQL語句 select top pageSize * from 表名 where id>=(select max(id) from (select top pages id from 表名 order by id asc ) t )
F. sqlserver 2005資料庫 怎麼進行分頁
分兩步實現
一、分頁的存儲過程如下
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[Pagination]
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) , -- 需要返回的列
@fldName varchar(255), -- 排序的欄位名
@PageSize int, -- 頁尺寸
@PageIndex int , -- 頁碼
@doCount bit=0, -- 返回記錄總數, 非 0 值則返回
@OrderType bit, -- 設置排序類型, 非 0 值則降序
@strWhere varchar(1500) -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主語句
declare @strTmp varchar(110) -- 臨時變數
declare @strOrder varchar(400) -- 排序類型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
else
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
--以上代碼的意思是如果@doCount傳遞過來的不是0,就執行總數統計。以下的所有代碼都是@doCount為0的情況
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName + '] desc'
end
--如果@OrderType不是0,就執行降序,這句很重要!
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName + '] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from [' + @tblName + '] where '
+ @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields
+ ' from [' + @tblName + '] ' + @strOrder
end
--如果是第一頁就執行以上代碼,這樣會加快執行速度
else
begin
--以下代碼賦予了@strSQL以真正執行的SQL代碼
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top '
+ str( ( @PageIndex - 1 ) * @PageSize ) + ' ['+ @fldName + '] from [' + @tblName + ']'
+ @strOrder + ') as tblTmp)' + @strOrder
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' ' + @strGetFields + ' from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str( ( @PageIndex - 1 ) * @PageSize ) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec(@strSQL)
二、頁面調用部分代碼
Function navindex(ByVal PageIndextemp As Integer, ByVal PageSizetemp As Integer, ByVal countint As Integer, ByVal pagename As String) As String
Dim i As Integer
If countint Mod PageSizetemp = 0 Then
i = countint \ PageSizetemp
Else
i = countint \ PageSizetemp + 1
End If
Dim maxi, mini As Integer
Dim navleft, navright, navstrtemp As String
If i < 10 Then
maxi = i
mini = 1
Else
maxi = pageindex + 3
mini = pageindex - 3
If mini > 1 Then
navleft = "<a href=""" & pagename & "?page=" & (mini - 1) & """ class=""link_nav_btn""><</a> "
Else
mini = 1
maxi = 10
End If
If maxi < i Then
navright = " <a href=""" & pagename & "?page=" & (maxi + 1) & """ class=""link_nav_btn"">></a>"
Else
If i - 10 > 0 Then
mini = i - 10
Else
mini = 1
End If
maxi = i
End If
End If
For n As Integer = mini To maxi
If n = pageindex Then
navstrtemp = navstrtemp & " <a href=""" & pagename & "?page=" & n & """ class=""link_nav_btn_select""><b>" & n & "</b></a>"
Else
navstrtemp = navstrtemp & " <a href=""" & pagename & "?page=" & n & """ class=""link_nav_btn"">" & n & "</a>"
End If
Next
navstrtemp = navleft & navstrtemp & navright
Return navstrtemp
End Function
Sub databinds(ByVal tblnametemp As String, ByVal strGetFieldstemp As String, ByVal fldNametemp As String, ByVal PageSizetemp As Integer, ByVal PageIndextemp As Integer, ByVal OrderTypetemp As Short, ByVal strWheretemp As String)
'tblnametemp表名,strGetFieldstemp需要返回的列,fldNametemp排序的欄位名,PageSizetemp頁尺寸,PageIndextemp頁碼,OrderTypetemp設置排序類型,strWheretemp查詢條件
'總數
cmdTM = New SqlCommand("select count(*) from " & tblnametemp & " where " & strWheretemp, conPubs)
conPubs.Open()
countint = CInt(cmdTM.ExecuteScalar())
conPubs.Close()
'導航
navstr = navindex(PageIndextemp, PageSizetemp, countint, "newshyxh.aspx")
'分頁
cmdTM = New SqlCommand("Pagination", conPubs)
cmdTM.CommandType = CommandType.StoredProcere
'add input
cmdTM.Parameters.Add("@tblName", SqlDbType.VarChar, 255).Value = tblnametemp
cmdTM.Parameters.Add("@strGetFields", SqlDbType.VarChar, 1000).Value = strGetFieldstemp
cmdTM.Parameters.Add("@fldName", SqlDbType.VarChar, 255).Value = fldNametemp
cmdTM.Parameters.Add("@PageIndex", SqlDbType.Int).Value = PageIndextemp
cmdTM.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSizetemp
cmdTM.Parameters.Add("@OrderType", SqlDbType.Bit).Value = OrderTypetemp
cmdTM.Parameters.Add("@strWhere", SqlDbType.VarChar, 1500).Value = strWheretemp
conPubs.Open()
newsright.DataSource = cmdTM.ExecuteReader()
newsright.DataBind()
conPubs.Close()
End Sub
G. SQLSERVER分頁查詢關於使用Top方式和row_number()解析函數的不同
臨近春節,心早已飛了不在工作上了,下面小編給大家整理些資料庫的幾種分頁查詢。
Sql
Sever
2005之前版本:
select
top
頁大小
*
from
表名
where
id
not
in
(
select
top
頁大小*(查詢第幾頁-1)
id
from
表名
order
by
id
)
order
by
id
例如:
select
top
10
*
--10
為頁大小
from
[TCCLine].[dbo].[CLine_CommonImage]
where
id
not
in
(
--40是這么計算出來的:10*(5-1)
--
頁大小*(查詢第幾頁-1)
select
top
40
id
from
[TCCLine].[dbo].[CLine_CommonImage]
order
by
id
)
order
by
id
結果為:
Sql
Sever
2005及以上版本,多了個分頁查詢方法:
/*
*
firstIndex:起始索引
*
pageSize:每頁顯示的數量
*
orderColumn:排序的欄位名
*
SQL:可以是簡單的單表查詢語句,也可以是復雜的多表聯合查詢語句
*/
select
top
pageSize
o.*
from
(select
row_number()
over(order
by
orderColumn)
as
rownumber,*
from(SQL)
as
o
where
rownumber>firstIndex;
例如:
select
top
10
numComImg.*
from
(
select
row_number()
over(order
by
id
asc)
as
rownumber,*
from
(select
*
FROM
[TCCLine].[dbo].[CLine_CommonImage])
as
comImg)
as
numComImg
where
rownumber>40
結果:
這兩個方法,就僅僅是多了一列
rewnumber
嗎?當然不是,來看下內部差別吧:
在兩個SQL上,分別加入以下SQL,並使用MS的「包括執行計劃」,便於查看執行詳情:
SET
STATISTICS
TIME
ON
GO
要執行的SQL:
SET
STATISTICS
TIME
ON
GO
select
top
10
numComImg.*
from
(
select
row_number()
over(order
by
id
asc)
as
rownumber,*
from
(select
*
FROM
[TCCLine].[dbo].[CLine_CommonImage])
as
comImg)
as
numComImg
where
rownumber>40
SET
STATISTICS
TIME
ON
GO
select
top
10
*
--10
為頁大小
from
[TCCLine].[dbo].[CLine_CommonImage]
where
id
not
in
(
--40是這么計算出來的:10*(5-1)
--
頁大小*(查詢第幾頁-1)
select
top
40
id
from
[TCCLine].[dbo].[CLine_CommonImage]
order
by
id
)
order
by
id
執行之後,查看執行計劃:
看得出,兩個同樣功能的SQL,執行時,使用
row_number()
的,要比是用
純TOP方式的,查詢開銷少得多,上圖顯示
28:72,純top方式,使用了兩次聚集掃描。
再來看下執行時間信息:
row_number()方式的:
純top方式:
相比之下,還是row_number()解析函數效率比較高寫。
以上所述是小編給大家分享的SQLSERVER分頁查詢關於使用Top方式和row_number()解析函數的不同,希望對大家有所幫助。
H. sqlserver查詢分頁問題,條件比較復雜,怎樣實現較好求指點
盡量不要使用嵌套子查詢,優先使用連接子查詢;
In 關鍵字盡量少使用,效率低,除非 in 包含的信息量非常少,並且叫固定;
如果查詢條件和查詢結果表無直接關聯,優先根據查詢條件查詢出符合條件的臨時結果值,然後和最終結果表關聯;
除 top n 方式分頁之外,使用 row_number() over 方式分頁也可以;
能明確指定結果欄位的,盡量不要用 * ;
不相關的欄位可以省略;
如果最終結果表數據比較大,考慮分表,分區,分庫;
查詢結果表欄位盡量不要包含大文本之類的欄位;
where 條件中對於varchar 欄位 的 like 查詢要適度,不要用太多,會影響效率;
I. sqlserver分頁查詢
select top 頁大小 *
from table1
where id>
(select max (id) from
(select top ((頁碼-1)*頁大小) id from table1 order by id) as T
)
order by id
J. 如何使用sql語句進行分頁操作
利用SQL語句分頁要看你用的什麼資料庫。
Oracle資料庫可以使用ROWNUM或row_number(),例如:Select
*
from
(select
ROWNUM
rn,
t.*
from
table
t)
where
rn
between
11
and
20;
Select
*
from
(select
row_number()
over
(ORDER
BY
col1)
rn,
t.*
from
table
t)
where
rn
between
11
and
20;
SQLServer資料庫可以用Top或者row_number()函數,道理同上。
利用SQL分頁有局限性,就是針對不同的資料庫有不同的寫法,所以通常會在應用程序裡面做分頁通用性比較強。但是對於數據量非常龐大的應用來說,還是用SQL分頁比較適合。