sqlserver分頁(yè)有四種方法,先給大家介紹一種常用的

創(chuàng)新互聯(lián)長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為鳳縣企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),鳳縣網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
查看1到3條數(shù)據(jù)
假如查詢每頁(yè)大小為3,查詢第2頁(yè)的數(shù)據(jù)就是
declare @iPage int --所取的頁(yè)的序數(shù) (第幾頁(yè))
declare @iPageNum int --所取的數(shù)據(jù)行數(shù)(除最后一頁(yè)外,每頁(yè)所取的行數(shù)應(yīng)該都是一樣的)
declare @iRecordNumber int --取@iPage頁(yè)時(shí),結(jié)尾記錄所在行數(shù)
declare @iRecordCount int --總記錄行數(shù)
--變量初始化
set @iPage=1 --可用參數(shù)傳遞
set @iPageNum=10 --默認(rèn)每頁(yè)取10行
set @iRecordNumber=@iPage*@iPageNum
select @iRecordCount=count(cirDeId) from (select cirDeId from CircleDetails group by cirDeId) a
--取最后一頁(yè)時(shí),重算結(jié)尾所在行數(shù)(@iRecordNumber)、所取記錄數(shù)(@iPageNum)
if @iRecordNumber@iRecordCount
begin
set @iRecordNumber=@iRecordCount
if (@iRecordNumber%@iPageNum)0
set @iPageNum=@iRecordNumber%@iPageNum
end
select * from (
select top @iPageNum * from(
select top @iRecordNumber cirDeId,
(select count(1) from CirclePost where CircleDetails.cirDeId = CirclePost.cirdeid_cp) circlepostcount
,(select count(1) from CircleAttention where CircleDetails.cirDeId = CircleAttention.cirdeid_ca) circleattentioncount
from CircleDetails group by cirDeId order by 3 desc,2 desc
) order by 3,2
) order by 3 desc,2 desc
寫存儲(chǔ)過(guò)程 ..
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER PROCEDURE usp_Province_pagination
@PageSize INT, --每頁(yè)的顯示的行數(shù)
@AbsolutePage INT, -- 當(dāng)前頁(yè)的頁(yè)數(shù)
@PageCount INT OUTPUT --總頁(yè)數(shù)
AS
DECLARE @BeginRecord INT --記錄每此從哪一行開始讀取
DECLARE @RecordCount INT --表中數(shù)據(jù)的總條數(shù)
DECLARE @sql NVARCHAR(1000)
SET @RecordCount = (SELECT count(*) FROM Province)
--表中沒(méi)有數(shù)據(jù)的情況
IF @RecordCount = 0
BEGIN
SET @PageCount = 0
RETURN(0)
END
-- 表中的總條數(shù)大于定義的每頁(yè)的行數(shù)的情況
IF @RecordCount @PageSize
BEGIN
-- 計(jì)算總能分多少頁(yè)
SET @PageCount = (@RecordCount + @PageSize - 1)/@PageSize
--當(dāng)前應(yīng)該從哪一行開始讀取
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 -- -- 表中的總條數(shù)大于定義的每頁(yè)的行數(shù)情況
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
存儲(chǔ)過(guò)程:create Procedure pname
( @pageIndex int,@pageSize)
as
select * from tableName order by id
offset @pageIndex * pageSize fetch next pageSize rows only
分頁(yè):
sqlserver 在2008之前 使用 top 和 not int top 的方式來(lái)做分頁(yè)
2008以后使用 row_number() 函數(shù)作為分頁(yè)關(guān)鍵函數(shù)
2012使用 offset 1 fetch next 10 rows only
你問(wèn)了2個(gè)問(wèn)題,你可以優(yōu)先把視圖,存儲(chǔ)過(guò)程,觸發(fā)器等弄明白,分頁(yè)是查詢,在存儲(chǔ)過(guò)程里可以寫復(fù)雜的sql文,只是在運(yùn)行時(shí)是預(yù)編譯和參數(shù)化查詢防止sql注入
分兩步實(shí)現(xiàn)
一、分頁(yè)的存儲(chǔ)過(guò)程如下
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
CREATE PROCEDURE [dbo].[Pagination]
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) , -- 需要返回的列
@fldName varchar(255), -- 排序的字段名
@PageSize int, -- 頁(yè)尺寸
@PageIndex int , -- 頁(yè)碼
@doCount bit=0, -- 返回記錄總數(shù), 非 0 值則返回
@OrderType bit, -- 設(shè)置排序類型, 非 0 值則降序
@strWhere varchar(1500) -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主語(yǔ)句
declare @strTmp varchar(110) -- 臨時(shí)變量
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傳遞過(guò)來(lái)的不是0,就執(zhí)行總數(shù)統(tǒng)計(jì)。以下的所有代碼都是@doCount為0的情況
else
begin
if @OrderType != 0
begin
set @strTmp = '(select min'
set @strOrder = ' order by [' + @fldName + '] desc'
end
--如果@OrderType不是0,就執(zhí)行降序,這句很重要!
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
--如果是第一頁(yè)就執(zhí)行以上代碼,這樣會(huì)加快執(zhí)行速度
else
begin
--以下代碼賦予了@strSQL以真正執(zhí)行的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)
二、頁(yè)面調(diào)用部分代碼
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頁(yè)尺寸,PageIndextemp頁(yè)碼,OrderTypetemp設(shè)置排序類型,strWheretemp查詢條件
'總數(shù)
cmdTM = New SqlCommand("select count(*) from " tblnametemp " where " strWheretemp, conPubs)
conPubs.Open()
countint = CInt(cmdTM.ExecuteScalar())
conPubs.Close()
'導(dǎo)航
navstr = navindex(PageIndextemp, PageSizetemp, countint, "newshyxh.aspx")
'分頁(yè)
cmdTM = New SqlCommand("Pagination", conPubs)
cmdTM.CommandType = CommandType.StoredProcedure
'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
當(dāng)前標(biāo)題:sqlserver怎么進(jìn)行分頁(yè),sqlserver2008分頁(yè)
網(wǎng)頁(yè)地址:http://chinadenli.net/article46/dsgiohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、外貿(mào)建站、網(wǎng)站策劃、域名注冊(cè)、網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)