MS SQLSERVER通用存儲過程分頁

MS SQLSERVER通用存儲過程分頁

    最近在面試的時候,遇到個奇葩的禿頂老頭面試官。

問:寫過存儲過程分頁嗎?

答:沒寫過,但是我知道分頁存儲的原理,我自己也寫過,只是在工作中沒寫過。

問:那你這麼多年工作中就沒寫過嗎?

答:的確沒寫過,因爲項目數據量都特別小。

然後,這奇葩就起身就要走人了,連個招呼都沒有。想我面試了這麼多公司,這種奇葩面試官,還是頭回見到,一點職業素質,禮貌都木有。氣死我了!

    明天要去入職新公司了,今天閒來無事,試着寫了寫這個存儲過程分頁。只在SQLSERVER2008上測試過,不過我想,2000以上版本應該都會支持的吧。

    廢話到此,上代碼。

if (object_id('Proc_Paging', 'P') is not null)
    drop proc Proc_Paging
go
create procedure Proc_Paging
(
    @TableName varchar(20),--表名
    @PageIndex int=0,--起始頁索引,從0開始
    @PageSize varchar(1000)='10',--默認每頁顯示的數量,默認每頁顯示10條記錄
    @Params varchar(100)='*',--分頁結果中顯示的字段,默認顯示全部的字段
    @ID varchar(20)='ID',--數據編號排序字段,默認爲ID
    @OrderByID varchar(20)='asc',--數據編號排序方式,默認爲正序排序
    @StrWhereSource varchar(100),--分頁數據的查詢條件,必須以where開頭
    @StrWherePaging varchar(100),--已經分頁的數據的查詢條件,不能以where開頭
    @OrderBy varchar(100)='ID asc'--數據排序方式
)
as
declare @Sql varchar(8000),@PageStartNum varchar(1000),@PageEndNum varchar(1000),@Sql2 varchar(1000),@Sql3 varchar(1000)
--1.獲取指定頁數據
set @PageStartNum=(@PageIndex)*(@PageSize)--起始數據編號
set @PageEndNum=(@PageIndex+1)*(@PageSize)--截止數據編號
set @Sql='select row_number() over(order by '+@ID+' '+@OrderByID+') Num,'+@Params+' '+
'into #temp '+
'from '+@TableName+' '+@StrWhereSource+''+
'select * from #temp where Num between '+
''+(@PageStartNum)+' and '+(@PageEndNum)+' '+@StrWherePaging+' order by '+@OrderBy+' '
exec(@Sql)
--print @Sql
--2.獲取總記錄數
set @Sql2='select count(1) from '+@TableName+''
exec(@Sql2)
--print @Sql2
--3.獲取分頁總數
set @Sql3='select ceiling(count(1)*1.0/('+@PageSize+')) from '+@TableName+''
exec(@Sql3)
--print @Sql3
go
--測試代碼
exec Proc_Paging 'Customers',2,10,'CustomerID,CompanyName,Address,City,PostalCode','CustomerID','asc','where PostalCode>''1000'' ','and Num>1 ','Num asc'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章