最近在做乙個幾百萬條資料的分頁查詢,研究了各種方案,在本機上用專案的實際資料庫做測試,測試過程 is very 痛苦,不堪回首ing。現在廢話不多說,直接上結果,相信這也是大多數搜尋答案的人最願意看的方式。
create
procedure [dbo].[p_gridviewpager] (@recordtotal int
output,
--輸出記錄總數
@viewname varchar(800),--表名
@fieldname varchar(800) = '*',
--查詢字段
@keyname varchar(200) = 'id',
--索引字段
@pagesize int = 20,
--每頁記錄數
@pageno int =1,--當前頁
@orderstring varchar(200),
--排序條件
@wherestring varchar(800) = '1=1'
--where條件)as
begin
declare @beginrow int
declare @endrow int
declare @templimit varchar(200)
declare @tempcount nvarchar(1000)
declare @tempmain varchar(1000)
--declare @timediff datetime
set nocount on
--select @timediff=getdate() --記錄時間
set @beginrow = ( @pageno - 1 ) * @pagesize + 1
set @endrow = @pageno * @pagesize
set @templimit = 'rows between '
+ cast(@beginrow as
varchar) + ' and '
+ cast(@endrow as
varchar)
--輸出引數為總記錄數
set @tempcount = 'select @recordtotal = count(*) from (select '
+ @keyname + ' from ' + @viewname + ' where '
+ @wherestring + ') as my_temp'
execute sp_executesql
@tempcount,
n'@recordtotal int output',
@recordtotal output
--主查詢返回結果集
set @tempmain = 'select * from (select row_number() over (order by '
+ @orderstring + ') as rows ,' + @fieldname
+ ' from ' + @viewname + ' where ' + @wherestring
+ ') as main_temp where ' + @templimit
--print @tempmain
execute (@tempmain)
--select datediff(ms,@timediff,getdate()) as 耗時
set nocount off
endgo
高效分頁儲存過程
高效分頁儲存過程 儲存過程與頁面呼叫如下 create procedure search sp tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸...
高效分頁儲存過程
儲存過程與頁面呼叫如下 create procedure search sp tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...
高效分頁儲存過程
儲存過程與頁面呼叫如下 create procedure search sp tblname varchar 255 表名 strgetfields varchar 1000 需要返回的列 fldname varchar 255 排序的欄位名 pagesize int 10,頁尺寸 pageinde...