存儲過程:create Procedure pname
成都創(chuàng)新互聯公司專業(yè)為企業(yè)提供豐城網站建設、豐城做網站、豐城網站設計、豐城網站制作等企業(yè)網站建設、網頁設計與制作、豐城企業(yè)網站模板建站服務,十多年豐城做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。
( @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個問題,你可以優(yōu)先把視圖,存儲過程,觸發(fā)器等弄明白,分頁是查詢,在存儲過程里可以寫復雜的sql文,只是在運行時是預編譯和參數化查詢防止sql注入
四種方式實現SQLServer
分頁查詢
SQLServer
的數據分頁:
假設現在有這樣的一張表:
CREATE
TABLE
test
(
id
int
primary
key
not
null
identity,
names
varchar(20)
)
然后向里面插入大約1000條數據,進行分頁測試
假設頁數是10,現在要拿出第5頁的內容,查詢語句如下:
--10代表分頁的大小
select
top
10
*
from
test
where
id
not
in
(
--40是這么計算出來的:10*(5-1)
select
top
40
id
from
test
order
by
id
)
order
by
id
原理:需要拿出數據庫的第5頁,就是40-50條記錄。首先拿出數據庫中的前40條記錄的id值,然后再拿出剩余部分的前10條元素
第二種方法:
還是以上面的結果為例,采用另外的一種方法
--數據的意思和上面提及的一樣
select
top
10
*
from
test
where
id
(
select
isnull(max(id),0)
from
(
select
top
40
id
from
test
order
by
id
)
A
)
order
by
id
原理:先查詢前40條記錄,然后獲得其最id值,如果id值為null的,那么就返回0
然后查詢id值大于前40條記錄的最大id值的記錄。
這個查詢有一個條件,就是id必須是int類型的。
第三種方法:
select
top
10
*
from
(
select
row_number()
over(order
by
id)
as
rownumber,*
from
test
)
A
where
rownumber
40
原理:先把表中的所有數據都按照一個rowNumber進行排序,然后查詢rownuber大于40的前十條記錄
這種方法和oracle中的一種分頁方式類似,不過只支持2005版本以上的
第四種:
存儲過程查詢
創(chuàng)建存儲過程
alter
procedure
pageDemo
@pageSize
int,
@page
int
AS
declare
@temp
int
set
@temp=@pageSize*(@page
-
1)
begin
select
top
(select
@pageSize)
*
from
test
where
id
not
in
(select
top
(select
@temp)
id
from
test)
order
by
id
end
執(zhí)行存儲過程
exec
10,5
利用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分頁比較適合。
sqlserver分頁有四種方法,先給大家介紹一種常用的
查看1到3條數據
假如查詢每頁大小為3,查詢第2頁的數據就是
寫存儲過程 ..
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
存儲過程:create Procedure 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個問題,你可以優(yōu)先把視圖,存儲過程,觸發(fā)器等弄明白,分頁是查詢,在存儲過程里可以寫復雜的sql文,只是在運行時是預編譯和參數化查詢防止sql注入
當前名稱:sqlserver怎么分頁,sql如何實現分頁
文章鏈接:http://www.ekvhdxd.cn/article10/dscsodo.html
成都網站建設公司_創(chuàng)新互聯,為您提供服務器托管、網站設計、營銷型網站建設、品牌網站建設、企業(yè)網站制作、軟件開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯