首页 / 数据库 / SQLServer / SQL Server 2005中利用临时表和@@RowCount提高分页查询存储过程
SQL Server 2005中利用临时表和@@RowCount提高分页查询存储过程2009-12-27 博客园 mikel最近发现现有框架的通用查询存储过程的性能慢,于是仔细研究了下代码:Alter PROCEDURE [dbo].[AreaSelect] @PageSize int=0, @CurrentPage int=1, @Identifier int=NULL, @ParentId int=NULL, @AreaLevel int=NULL, @Children int=NULL, @AreaName nvarchar(50)=NULL, @Path nvarchar(MAX)=NULL, @Status int=NULL, @Alt int=NULL AS BEGIN SET NOCOUNT ON; IF (NOT @AreaName IS NULL) SET @AreaName="%"+@AreaName+"%" IF (NOT @Path IS NULL) SET @Path="%"+@Path+"%" IF (@PageSize>0) BEGIN DECLARE @TotalPage int Select @TotalPage=Count(Identifier) FROM Area Where (@Identifier IS NULL or Identifier=@Identifier)AND (@ParentId IS NULL or ParentId=@ParentId)AND (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND (@Children IS NULL or Children=@Children)AND (@AreaName IS NULL or AreaName Like @AreaName)AND (@Path IS NULL or Path Like @Path)AND (@Status IS NULL or Status=@Status)AND (@Alt IS NULL or Alt=@Alt) IF(@TotalPage%@PageSize=0) BEGIN SET @TotalPage=@TotalPage/@PageSize END ELSE BEGIN SET @TotalPage=Round(@TotalPage/@PageSize,0)+1 END Select TOP (@PageSize) Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt,@TotalPage as totalPage FROM Area Where Identifier NOT IN (Select Top (@PageSize*(@CurrentPage-1))Identifier FROM Area Where (@Identifier IS NULL or Identifier=@Identifier)AND (@ParentId IS NULL or ParentId=@ParentId)AND (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND (@Children IS NULL or Children=@Children)AND (@AreaName IS NULL or AreaName Like @AreaName)AND (@Path IS NULL or Path Like @Path)AND (@Status IS NULL or Status=@Status)AND (@Alt IS NULL or Alt=@Alt) order by AreaName asc) AND (@Identifier IS NULL or Identifier=@Identifier)AND (@ParentId IS NULL or ParentId=@ParentId)AND (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND (@Children IS NULL or Children=@Children)AND (@AreaName IS NULL or AreaName Like @AreaName)AND (@Path IS NULL or Path Like @Path)AND (@Status IS NULL or Status=@Status)AND (@Alt IS NULL or Alt=@Alt) order by AreaName asc END ELSE BEGIN Select Identifier,ParentId,AreaLevel,Children,AreaName,Path,Status,Alt FROM Area Where (@Identifier IS NULL or Identifier=@Identifier)AND (@ParentId IS NULL or ParentId=@ParentId)AND (@AreaLevel IS NULL or AreaLevel=@AreaLevel)AND (@Children IS NULL or Children=@Children)AND (@AreaName IS NULL or AreaName Like @AreaName)AND (@Path IS NULL or Path Like @Path)AND (@Status IS NULL or Status=@Status)AND (@Alt IS NULL or Alt=@Alt) order by AreaName asc END END