对SQL Server中任意select语句分页的存储过程


  本文标签:SQL select语句

  对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函数  。