mssql高效的分頁儲存過程

2021-07-28 02:26:45 字數 1774 閱讀 2285

最近在做乙個幾百萬條資料的分頁查詢,研究了各種方案,在本機上用專案的實際資料庫做測試,測試過程 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...