手邊開發的後端項目一直以來都用的.NET MVC框架,訪問資料庫使用其自帶的EF CodeFirst模式,寫存儲過程的能力都快退化了 閑來無事,自己寫了條分頁存儲過程,網上類似的文章多的是,這裡只列了一種情況,依據分析函數生成行號來實現分頁查詢 環境:sqlServer 2014 創建資料庫過程不再 ...
手邊開發的後端項目一直以來都用的.NET MVC框架,訪問資料庫使用其自帶的EF CodeFirst模式,寫存儲過程的能力都快退化了
閑來無事,自己寫了條分頁存儲過程,網上類似的文章多的是,這裡只列了一種情況,依據分析函數生成行號來實現分頁查詢
環境:sqlServer 2014
創建資料庫過程不再敖述,這裡直接進入重點:
1、首先創建了一張TestAdmin表,主鍵為ID欄位int類型且自增
1 create table TestAdmin ( 2 Id int identity(1,1) primary Key, 3 Name varchar(Max), 4 Age int 5 )
2、接著批量導入1000條模擬數據
1 declare @count int 2 --這裡定義模擬數據條數 3 set @count=1000 4 5 6 while(@count>0) 7 begin 8 insert into TestAdmin (Name,Age) values ('zhuyuan'+convert(varchar,@count),@count) 9 set @count=@count-1 10 end
1 select * from TestAdmin
導入完成,開始分頁:
大致思路為首先按一定排序規則查詢出所有數據,然後為每一行自動生成行號,然後再對生成行號後的表進行where語句篩選處理
3、我們先為主表每行插入一列相同數據生成表V1,目的主要是為了後面的分析函數可以對錶進行單行聚合
1 select *,1 as SameRow from TestAdmin
- (表V1)
4、再對錶V1進行生成行號處理,利用sqlServer自帶分析函數ROW_NUMBER()可實現該功能
1 select ROW_NUMBER() over(partition by SameRow order by Id) as Row,* from (select *,1 as SameRow from TestAdmin)m
生成表V2
- (表V2)
這時我們已經有一張具有索引行號的表V2,後面的操作就清晰了
5、假設我們需要每頁10條數據,且查詢第二頁
1 select * from (select ROW_NUMBER() over(partition by SameRow order by Id) as Row,* from (select *,1 as SameRow from TestAdmin)m)o where o.Row between 1*10+1 and 2*10
6、再做一次封裝,為它創建一個存儲過程,便於我們以後再次調用
1 create proc select_page 2 ( 3 @pageIndex int,--當前頁碼 4 @pagecount int--每頁條數 5 ) 6 as 7 begin 8 select * from (select ROW_NUMBER() over(partition by SameRow order by Id) as Row,* from (select *,1 as SameRow from TestAdmin)m)o where o.Row between @pageIndex*@pagecount+1 and (@pageIndex+1)*@pagecount 9 end
存儲過程創建成功!
7、我們來試一下,假設要查詢第5頁,每頁10條
1 select_page 5,10
後面再對該表進行分頁查詢時就明顯輕鬆許多^o^
留個腳印——2016.12.16 中午(陽光正好)