对SQL Server中任意select语句,如何才能分页呢?下面将为您建立一个通用的存储过程,对SQL Server中任意select语句进行分页,供您参考 。
CREATE PROCEDURE [dbo].[usp_ResultWithPage]
@fields_Type varchar(1000), --字段列表(带类型),用于@t表变量的字段声明,如:PhotoID int,UserID int,PhotoTitle nvarchar(50)
@fieldsInT varchar(500), --字段列表(不带类型),用于分页部分读取@t表变量的字段,也可使用*代替,但性能会下降,如:PhotoID ,UserID ,PhotoTitle
@selectSrting varchar(2000), --向@t表变量中读取记录的Select语句,如:SELECT PhotoID ,UserID ,PhotoTitle FROM Photo_Basic
@result_OrderBy varchar(200), --对分页结果进行排序的字段,如:升序PhotoID ASC、降序PhotoID DESC
@pageSize int, --页尺寸,0表示返回所有行
@currentPage int, --当前页,首页为1
@IsReCount bit -- 非0值则返回记录总数
AS
BEGIN
---------------得到表变量@t-------------------------
DECLARE @strSql varchar(2000)
SET @strSql = DECLARE @t TABLE( + @fields_Type + );
SET @strSql = @strSql + INSERT INTO @t + @selectSrting + ;
--显示表变量的内容
--SET @strSql = @strSql + SELECT + @fieldsInT + FROM @t;
----------进行分页------------------------------------
IF @pageSize = 0
SET @strSql = @strSql + SELECT + @fieldsInT + FROM @t ;
ELSE
IF @currentPage = 1
SET @strSql = @strSql + SELECT TOP( + Str(@pageSize) + ) + @fieldsInT + FROM @t ;
ELSE
BEGIN
SET @strSql = @strSql + SELECT TOP( + Str(@pageSize) + ) * FROM ( SELECT TOP( + Str(@pageSize * @currentPage) + ) *, ROW_NUMBER() OVER (ORDER BY + @result_OrderBy + )
SET @strSql = @strSql + AS RowNumber FROM @t
SET @strSql = @strSql + ) AS r WHERE r.RowNumber > + Str(@pageSize * (@currentPage - 1)) + ;
END
IF @IsReCount != 0
SET @strSql = SELECT COUNT(1) AS Total FROM @t ;
--RETURN @strSql
EXEC(@strSql)
-----------------------
END
总结一下,主要思想还是用了sql server 的 top row_number函数 。