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+' +
'select * from #temp where Num between '+
''+(@PageStartNum)+' and '+(@PageEndNum)+'  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'
go

下面是運行結果截圖。

執行結果:

wKioL1UvfJPAQF7DAAKy9EZv-io744.jpg

生成的sql語句:

wKiom1Uvez-jaRYRAAF0uZ7sZ3c674.jpg

    大神,勿噴;菜鳥,輕拍。謝謝!

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