最佳实践定制分页SQL server 2005

最佳实践定制分页SQL server 2005,sql,sql-server-2008,sql-server-2005,pagination,Sql,Sql Server 2008,Sql Server 2005,Pagination,我在SQLServer2005上遇到了分页问题,SQLServer2005运行查询2次以获取数据和总计行。我的演示程序基于Northwind数据库。请帮助我如何在无需再次查询的情况下获取总行数 CREATE PROCEDURE [dbo].[SearchEmployees] @search nvarchar(4000) ,@orderBy varchar(200) ,@PageSize int ,@PageIndex int ,@TotalRowsN

我在SQLServer2005上遇到了分页问题,SQLServer2005运行查询2次以获取数据和总计行。我的演示程序基于Northwind数据库。请帮助我如何在无需再次查询的情况下获取总行数

CREATE PROCEDURE [dbo].[SearchEmployees] 
     @search nvarchar(4000)
    ,@orderBy varchar(200)
    ,@PageSize int
    ,@PageIndex int 
    ,@TotalRowsNumber int output
AS
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int

SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageSize + @PageLowerBound

--Default order by to first column
IF (@OrderBy is null or LEN(@OrderBy) < 1)
BEGIN
    SET @OrderBy = 'EmployeeID DESC'
END

-- SQL Server 2005 Paging
declare @SQL as nvarchar(4000)
declare @SQLCOUNT as nvarchar(4000)
declare @Param as nvarchar(500)

SET @SQL = 'WITH PageIndex AS ('
SET @SQL = @SQL + ' SELECT  '
IF @PageSize > 0
BEGIN
    SET @SQL = @SQL + ' TOP ' + convert(nvarchar, @PageUpperBound)
END

SET @SQL = @SQL + ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') as RowIndex '
SET @SQL = @SQL + ' ,EmployeeID'
SET @SQL = @SQL + ', LastName'
SET @SQL = @SQL + ', FirstName'
SET @SQL = @SQL + ', Title'

SET @SQL = @SQL + ' FROM employees'
IF Len(@Search) > 0 
BEGIN
    SET @SQL = @SQL + ' ' + @Search
END
SET @SQL = @SQL  + ') SELECT '
SET @SQL = @SQL + ' EmployeeID'
SET @SQL = @SQL + ', LastName'
SET @SQL = @SQL + ', FirstName'
SET @SQL = @SQL + ', Title'
SET @SQL = @SQL + ' FROM PageIndex  '
SET @SQL = @SQL + ' WHERE RowIndex > ' + convert(nvarchar, @PageLowerBound)

IF @PageSize > 0
BEGIN
SET @SQL = @SQL + ' AND RowIndex <= ' + convert(nvarchar, @PageUpperBound)
END

--Get Row Count
SET @SQLCOUNT = 'SELECT @TotalRowsNumber  = count(EmployeeID)
                    FROM employees' 
SET @Param = N'@Search nvarchar(2000),@TotalRowsNumber INT OUTPUT'
IF LEN(@Search) > 0
BEGIN
    SET @SQLCOUNT = @SQLCOUNT + @Search 
END
exec sp_executesql @SQL
exec sp_executesql @SQLCOUNT, @Param,@Search=@Search,@TotalRowsNumber = @TotalRowsNumber OUT

提前谢谢

像这样试试,把它当作一个例子

CREATE Procedure usp_GetBookings
@pageIndex int,
@pageSize tinyint
as
;with CTE as 
(
Select Distinct ROW_NUMBER() over( order by ssi.SSItineraryID desc) as seq ,Count(*) over() as TotalRow,ssi.SSItineraryID 
 from SightSeeingItinerary as ssi
)

select * from CTE
where cte.seq  between  (@pageIndex-1) * @pageSize+1 and ((@pageIndex-1) * @pageSize +(@pageSize))

谢谢你的回复。我使用的逻辑和你推荐的一样!它工作得很好D