SQLServer 高效 分頁存儲過程


/**********************************************************************
參數:@PrimaryKey 主鍵,@OrderBy 排序字段,@SqlStr sql語句,@PageSize 每頁顯示的記錄,@PageIndex 當前頁(從0開始)
***********************************************************************/
ALTER procedure [dbo].[PageQuery]
@PrimaryKey varchar(100),--主鍵
@OrderBy varchar(100),--排序字段
@SqlStr varchar(8000),--sql語句
@PageSize int,--每頁顯示的記錄
@PageIndex int--當前頁(從1開始)
--@RecordCount int output --返回的總記錄數
as
declare @ExecSql varchar(8000)--要執行的Sql組合
if @OrderBy=''
set @OrderBy='order by '+@PrimaryKey+' asc'
else if (len(@OrderBy)<8 or upper(substring(@OrderBy,1,8))<>'ORDER BY')
set @OrderBy='order by '+@OrderBy
if @PageSize=-1--用於ajax的第一次查詢
set @PageSize=0
set @PageIndex=@PageIndex-1
print('-----'+CAST(@PageIndex as varchar(10)) )
begin
declare @recordCount int,@pageCount int
declare @s nvarchar(4000)
set @s = N'select @recordCount = count('+@PrimaryKey+') from ('+@SqlStr+') TN'
exec sp_executeSql @s,N'@recordCount int output',@recordCount output
if(@pageSize>0)
set @pageCount = (@recordCount - 1 + @PageSize) / @PageSize;--總頁數
else
set @pageCount = 0;--總頁數

	if @PageIndex<=0--如果是第一頁就執行這個
		begin
			set @ExecSql='select top '+cast(@PageSize as varchar(100))+' * from ('+@SqlStr+') T '+@OrderBy
		end
	else
		begin
			if charindex('2000 - 8.00.',@@version)>0
				begin
					set @ExecSql=
					'select top '+cast(@PageSize as varchar(100))+' *
					from ('+@SqlStr+') as T where T.'+@PrimaryKey+' not in
					(select top '+cast((@PageSize*@PageIndex) as varchar(100))+' '+@PrimaryKey+'
						from ('+@SqlStr+') T2 '+@OrderBy+') '+ @OrderBy
				end
			else
				begin
					set @ExecSql=
					'select * from
					(
						select * from
						(SELECT *, #RowNum#=ROW_NUMBER() OVER('+@OrderBy+') FROM ('+@SqlStr+') T1) T2 where T2.#RowNum#>='+cast(@PageSize*@PageIndex+1 as varchar(10))+' and T2.#RowNum#<='+cast(@PageSize*(@PageIndex+1) as varchar(10))+'
					) T3
					'
				end
		end
		exec (@ExecSql+' select '+@recordCount+' as RecordCount,'+@pageCount+' as PageCount ')

end

感興趣的可以加QQ群:765907694 一起交流,探討技術問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM