由於現在很多的企業招聘的筆試都會讓來招聘的寫一個分頁的存儲過程,有的企業甚至要求應聘者用兩種方式實現分頁,如果沒有在實際項目中使用過分頁,那麼很多的應聘者都會出現一定的問題,下面介紹兩種分頁的方法。
一、 以學生表為例,在數據庫中有一個Student表,字段有StudentNo, ,LoginPwd, StudentName,Sex,ClassId,Phone,Address,BornDate,Email,isDel
要求:查詢學生的信息,每頁顯示5條記錄
二、第一種方式分頁:利用子查詢 not in
例如:
第一頁
select top 5 * from Student
第二頁: 查詢前10條中不在前5條的記錄,那麼就是6-10,也就是第二頁
select top 5 * from Student where StudentNo not in(select top 10 Studentno from Student)
同理可以得到第三頁、、、、、、、
這種方式相信大家都能明白,這種分頁的存儲過程寫法就不多做介紹,重點介紹下面那種分頁方法。
三、第二種方式分頁:利用ROW_NUMBER()這個自帶的函數
因為自05之後,提供一個專門用於分頁的函數,那就是ROW_NUMBER()這個函數,分頁的基本語法:ROW_NUMBER() over(排序字段):可以根據指定的字段排序,對排序之後的結果集的每一行添加一個不間斷的行號,相當於連續的id值一樣,
例如sql語句:select ROW_NUMBER() over(order by studentno) id, * from Student 那麼結果集可以看到:
那麼我們可以看到id值是連續的,所有接下來的存儲過程寫起來就比較簡單了。
注意:我們必須為這個結果集命一個新名字,比如我們命名為temp,那麼分頁存儲過程可以寫出:
if exists( select * from sysobjects where name='usp_getPageData') drop proc usp_getPageData --如果存在名字為usp_getPageData的存儲過程則刪除 go create proc usp_getPageData --創建名字usp_getPageData存儲過程 @toPage int=0 output, --總頁數 @pageIndex int =1 , --默認顯示第一頁 @pageCount int =5 --默認每頁的記錄為5條 as select temp.StudentNo,temp.LoginPwd,temp.StudentName,temp.Sex,temp.ClassId,temp.Phone,temp.Address,temp.BornDate,temp.Email,temp.isDel from (select ROW_NUMBER() over (Order by studentno) id,* from Student) temp where id>(@pageIndex-1)*@pageCount and id<=@pageIndex*@pageCount set @toPage=ceiling((select COUNT(*) from Student)*1.0/@pageCount) --使用ceiling函數算出總頁數 go
說明因為在實際的項目的開發中,經常要顯示總頁數給用戶看的,所有這裡的存儲過程增加了一個toPage參數,由於它是要輸出給用戶看的,所有參數類型定義為output,並用set進行賦值。
以上是對兩種分頁方法的介紹,如果有任何疑問或不懂的可以留言給我。
試試:
private DataTable GetDataByPageProc(String TableName, String Primarykey, String FieldsName, String ByWHERE
, String ByOrder, int PageSize, int PageIndex, ref int RecordCount, ref int PageCount)
{
SqlConnection cn = new SqlConnection(Function.ConnectionString);
String sql = "exec P_SlipPage @TableName=@a,@Primarykey=@b,@FieldsName=@c,@ByWHERE=@d ,@ByOrder=@e ,@PageSize=@f ,@PageIndex=@g ,@RecordCount=@h ,@PageCount =@i";
using (SqlDataAdapter da = new SqlDataAdapter(sql, cn))
{
da.SelectCommand.Parameters.AddWithValue("@a", TableName);
da.SelectCommand.Parameters.AddWithValue("@b", Primarykey);
da.SelectCommand.Parameters.AddWithValue("@c", FieldsName);
da.SelectCommand.Parameters.AddWithValue("@d", ByWHERE);
da.SelectCommand.Parameters.AddWithValue("@e", ByOrder);
da.SelectCommand.Parameters.AddWithValue("@f", PageSize);
da.SelectCommand.Parameters.AddWithValue("@g", PageIndex);
da.SelectCommand.Parameters.AddWithValue("@h", RecordCount);
da.SelectCommand.Parameters.AddWithValue("@i", PageCount);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}...余下全文>>
CREATE PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 頁尺寸
@PageIndex int = 1, -- 頁碼
@doCount bit = 0, -- 返回記錄總數, 非 0 值則返回
@OrderType bit = 0, -- 設置排序類型, 非 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'
--如果@OrderType不是0,就執行降序,這句很重要!
end
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) +' '+@strG......余下全文>>