最近在面試的時候,遇到個奇葩的禿頂老頭面試官。
問:寫過存儲過程分頁嗎?
答:沒寫過,但是我知道分頁存儲的原理,我自己也寫過,只是在工作中沒寫過。
問:那你這么多年工作中就沒寫過嗎?
答:的確沒寫過,因為項目數(shù)據(jù)量都特別小。
然后,這奇葩就起身就要走人了,連個招呼都沒有。想我面試了這么多公司,這種奇葩面試官,還是頭回見到,一點(diǎn)職業(yè)素質(zhì),禮貌都木有。氣死我了!
明天要去入職新公司了,今天閑來無事,試著寫了寫這個存儲過程分頁。只在SQLSERVER2008上測試過,不過我想,2000以上版本應(yīng)該都會支持的吧。
廢話到此,上代碼。
if (object_id('PRoc_Paging', 'P') is not null) drop proc Proc_Paginggocreate procedure Proc_Paging(@TableName varchar(20),--表名@PageIndex int=0,--起始頁索引,從0開始@PageSize varchar(1000)='10',--默認(rèn)每頁顯示的數(shù)量,默認(rèn)每頁顯示10條記錄@Params varchar(100)='*',--分頁結(jié)果中顯示的字段,默認(rèn)顯示全部的字段@ID varchar(20)='ID',--數(shù)據(jù)編號排序字段,默認(rèn)為ID@OrderByID varchar(20)='asc',--數(shù)據(jù)編號排序方式,默認(rèn)為正序排序@StrWhereSource varchar(100),--分頁數(shù)據(jù)的查詢條件,必須以where開頭@StrWherePaging varchar(100),--已經(jīng)分頁的數(shù)據(jù)的查詢條件,不能以where開頭@OrderBy varchar(100)='ID asc'--數(shù)據(jù)排序方式)asdeclare @Sql varchar(8000),@PageStartNum varchar(1000),@PageEndNum varchar(1000),@Sql2 varchar(1000),@Sql3 varchar(1000)--1.獲取指定頁數(shù)據(jù)set @PageStartNum=(@PageIndex)*(@PageSize)--起始數(shù)據(jù)編號set @PageEndNum=(@PageIndex+1)*(@PageSize)--截止數(shù)據(jù)編號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.獲取總記錄數(shù)set @Sql2='select count(1) from '+@TableName+''exec(@Sql2)--print @Sql2--3.獲取分頁總數(shù)set @Sql3='select ceiling(count(1)*1.0/('+@PageSize+')) from '+@TableName+''exec(@Sql3)--print @Sql3go--測試代碼exec Proc_Paging 'Customers',2,10,'CustomerID,CompanyName,Address,City,PostalCode','CustomerID','asc','where PostalCode>''1000'' ','and Num>1 ','Num asc'go
下面是運(yùn)行結(jié)果截圖。
執(zhí)行結(jié)果:
生成的sql語句:
大神,勿噴;菜鳥,輕拍。謝謝!
新聞熱點(diǎn)
疑難解答
圖片精選