最近在面試的時候,遇到個奇葩的禿頂老頭面試官。
問:寫過存儲過程分頁嗎?
答:沒寫過,但是我知道分頁存儲的原理,我自己也寫過,只是在工作中沒寫過。
問:那你這么多年工作中就沒寫過嗎?
答:的確沒寫過,因為項目數據量都特別小。
然后,這奇葩就起身就要走人了,連個招呼都沒有。想我面試了這么多公司,這種奇葩面試官,還是頭回見到,一點職業素質,禮貌都木有。氣死我了!
明天要去入職新公司了,今天閑來無事,試着寫了寫這個存儲過程分頁。只在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' go
下面是運行結果截圖。
執行結果:
生成的sql語句:
大神,勿噴;菜鳥,輕拍。謝謝!