支援排序和不排序的海量資料分頁儲存過程

2021-04-15 22:04:53 字數 4467 閱讀 8808

create procedure [dbo].[proc_pagination]

@keyname   varchar(255),

@tblname   varchar(255),

@strgetfields varchar(1000) = '*',

@pagesize   int = 10,

@pageindex  int = 1,

@pagecount  int = 1 output,

@datacount  decimal = 1 output,

@sortname varchar(255)='',

@sorttype varchar(255) = 'asc',

@searchcondition  varchar(1500) = ''

as declare @strsql   nvarchar(4000)

declare @strtmp   varchar(110)

declare @strorder varchar(400)

declare @seaorder varchar(400)

begin  

if @searchcondition !=''  

set @strsql = 'select @datacount=count(*) from [' + @tblname + '] where '+@searchcondition

else

set @strsql = 'select @datacount=count(*) from [' + @tblname + ']'

exec sp_executesql @strsql,n'@datacount int out ',@datacount out

set @pagecount=(@datacount+@pagesize-1)/@pagesize

if @pageindex>@pagecount

set @pageindex=@pagecount

endif @sortname!=''

begin

if @sorttype = 'desc'

begin

set @strorder = ' order by [' + @sortname +'] desc'

if @pageindex*2<@pagecount

set @seaorder = ' order by [' + @sortname +'] desc'

else

set @seaorder = ' order by [' + @sortname +'] asc'

endelse

begin

set @strorder = ' order by [' + @sortname +'] asc'

if @pageindex*2<@pagecount

set @seaorder = ' order by [' + @sortname +'] asc'

else

set @seaorder = ' order by [' + @sortname +'] desc'

endif @pageindex = 1

begin

if @searchcondition != ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from [' + @tblname + '] where ' + @searchcondition + ' ' + @strorder

else

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from ['+ @tblname + '] '+ @strorder

endelse

begin

if @pageindex*2<@pagecount

if @searchcondition = ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from [' + @tblname + '] where [' + @keyname + '] not in(select ['+ @keyname + '] from (select top ' + str((@pageindex-1)*@pagesize) + ' ['+ @keyname + '] from [' + @tblname + ']' + @seaorder + ') as tbltmp)'+ @strorder

else

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from [' + @tblname + '] where [' + @keyname + '] not in(select [' + @keyname + '] from (select top ' + str((@pageindex-1)*@pagesize) + ' [' + @keyname + '] from [' + @tblname + '] where ' + @searchcondition + ' ' + @seaorder + ') as tbltmp) and ' + @searchcondition + ' ' + @strorder

else

if @searchcondition = ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from [' + @tblname + '] where [' + @keyname + '] in(select ['+ @keyname + '] from (select top ' + str(@datacount-(@pageindex-1)*@pagesize) + ' ['+ @keyname + '] from [' + @tblname + ']' + @seaorder + ') as tbltmp)'+ @strorder

else

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from [' + @tblname + '] where [' + @keyname + '] in(select [' + @keyname + '] from (select top ' + str(@datacount-(@pageindex-1)*@pagesize) + ' [' + @keyname + '] from [' + @tblname + '] where ' + @searchcondition + ' ' + @seaorder + ') as tbltmp) and ' + @searchcondition + ' ' + @strorder

endend

else

begin

if @pageindex = 1

begin

if @searchcondition != ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from [' + @tblname + '] where ' + @searchcondition

else

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from ['+ @tblname + ']'

endelse

begin

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ '  from ['

+ @tblname + '] where [' + @keyname + '] >(select max(['+ @keyname + ']) from (select top ' + str((@pageindex-1)*@pagesize) + ' ['+ @keyname + '] from [' + @tblname + '] order by ' + @keyname + ') as tbltmp)'

if @searchcondition != ''

set @strsql = 'select top ' + str(@pagesize) +' '+@strgetfields+ ' from [' + @tblname + '] where [' + @keyname + '] >(select max([' + @keyname + ']) from (select top ' + str((@pageindex-1)*@pagesize) + ' [' + @keyname + '] from [' + @tblname + '] where ' + @searchcondition + ' order by ' + @keyname + ') as tbltmp) and ' + @searchcondition

endend

exec sp_executesql @strsql

海量資料排序

海量資料排序 2011 04 12 19 33 1億資料找出最大的1w個 1.分塊法 解法 a.採用分塊法,將1億資料分成100w一塊,共100塊。b.對每塊進行快速排序,分成兩堆,如果大堆大於1w個,則對大堆再次進行快速排序,直到小於等於1w停止 假設此時大堆有n個 此時對小堆進行排序,取最大的1...

海量資料排序

今天要給100億個數字排序,100億個 int 型數字放在檔案裡面大概有 37.2gb,非常大,記憶體一次裝不下了。那麼肯定是要拆分成小的檔案乙個乙個來處理,最終在合併成乙個排好序的大檔案。實現思路 1.把這個37gb的大檔案,用雜湊分成1000個小檔案,每個小檔案平均38mb左右 理想情況 把10...

海量資料排序演算法

題目 有100萬無序資料,要求從小到大排序。但是每次記憶體只能排序1萬條資料。1.因為每次只能處理1萬條資料,所以要分組處理,我們將100萬資料分成100組 2.因為每組資料都是無序的,所以我們使用平均時間複雜度較好的演算法。3.當我們分組排序完成後,我們要排序1萬條資料就會簡單很多了。我們一共要取...