[轉]SET ROWCOUNT 分页

from http://hi.baidu.com/yfann/blog/item/65669982ebb16798f703a64e.html

Set RowCount 功能:
使 Microsoft® SQL Server™ 在返回指定的行数之后停止处理查询。

Declare @SortID --A表的整形主键1,2,3.....1000
Set RowCount 10
Select @SortID=SortID From [A] Order By SortID DESC
Print @SortID
结果为991
Set RowCount 10
Select * From [A] Order By SortID DESC
结果为一个记录集,SortID 为 1000-991
我们按pagesize为10,将A表按SortID 递减排列,取第2页的代码如下
Declare @SortID
Set RowCount 10 --- pageSize * (2-1)
Select @SortID=SortID From [A] Order By SortID DESC
Set Rowcount PageSize
Select * From [A] Where SortID < @SortID Order By SortID DESC

    下面的是动易的用来按不同字段排序并分页的一个通用存储过程(SQL2000)

 

 

[轉]SET ROWCOUNT 分页 代码
ALTER   PROCEDURE   [ dbo ] . [ PR_Common_GetListBySortColumn ]
(
@StartRows   int ,
@PageSize   int ,
@PrimaryColumn   varchar ( 1000 ), -- 主键
@SortColumnDbType   varchar ( 100 ),  -- 排序字段的数值类型 如 Int ,DateTime等
@SortColumn   varchar ( 1000 ), -- -排序的列
@StrColumn   varchar ( 1000 ), -- - 需要选择的列
@Sorts   varchar ( 100 ), -- - ASC|DESC|空字串(ASC)
@Filter   varchar ( 1000 ), -- - where 后面的条件
@TableName   varchar ( 1000 ), --  表名
@Total   int  OUTPUT
)
AS

SET  NOCOUNT  ON

Begin
IF   @StartRows <= 0
SET   @StartRows   =   0

DECLARE   @equalOperator   char ( 2 )
IF   @StartRows = 0
BEGIN
   
SET   @equalOperator   =   ' = '
   
SET   @StartRows   =   1
END
ELSE
SET   @equalOperator   =   ''

/* Set sorting variables. */
DECLARE   @operator   char ( 2 )

IF   CHARINDEX ( ' DESC ' , @Sorts ) > 0
BEGIN
   
SET   @operator   =   ' < '   +   @equalOperator
END
ELSE
BEGIN
   
SET   @operator   =   ' > '   +   @equalOperator
END
DECLARE   @strFilter   varchar ( 1000 )
DECLARE   @strSimpleFilter   varchar ( 1000 )

IF   @Filter   IS   NOT   NULL   AND   @Filter != ''
BEGIN
   
SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
   
SET   @strSimpleFilter   =   '  AND  '   +   @Filter   +   '   '
END
ELSE
BEGIN  
   
SET   @strFilter   =   ''
   
SET   @strSimpleFilter   =   ''
END

DECLARE   @Sql   nVarchar ( 4000 )
SET   @Sql = N ' SELECT @Total=Count(*) FROM  '   +   @TableName   +   @strFilter
Exec  sp_executesql  @Sql , N ' @Total Int Out ' , @Total  Out

IF   @PageSize <= 0
SET   @PageSize = @Total

IF   @PrimaryColumn != @SortColumn
BEGIN
EXEC (
' DECLARE @SortId int  '   +
' DECLARE @SortCol  ' +   @SortColumnDbType   +   '   ' +
' SET ROWCOUNT  ' +   @StartRows   +   '
SELECT @SortId = 
' +   @PrimaryColumn   +   ' ,@SortCol= ' +   @SortColumn   + '  FROM  ' +   @TableName   +   @strFilter   + '  ORDER BY  ' +   @SortColumn   + '   '   + @Sorts   +   ' , '   +   @PrimaryColumn   +   '   '   + @Sorts   + '
SET ROWCOUNT 
' +   @PageSize   +   '
SELECT 
' +   @StrColumn   + '  FROM  ' +   @TableName   +   '  
WHERE (
' +   @SortColumn   +   @operator + '  @SortCol OR ( ' +   @SortColumn   +   ' = @SortCol AND  ' +   @PrimaryColumn   +   @operator   + '  @SortId )) '   +   @strSimpleFilter   +   '  ORDER BY  ' +   @SortColumn   +   '   '   + @Sorts   +   ' , '   +   @PrimaryColumn   +   '   ' +   @Sorts   +   ''
)
END
ELSE
BEGIN
EXEC (
' DECLARE @SortId int  '   +
' SET ROWCOUNT  ' +   @StartRows   +   '
SELECT @SortId = 
' +   @SortColumn   +   '  FROM  ' +   @TableName   +   @strFilter   + '  ORDER BY  ' +   @SortColumn   +   '   '   + @Sorts   + '
SET ROWCOUNT 
' +   @PageSize   +   '
SELECT 
' +   @StrColumn   + '  FROM  ' +   @TableName   +   '  
WHERE 
' +   @SortColumn   +   @operator   + '  @SortId  ' +   @strSimpleFilter   +   '  ORDER BY  ' +   @SortColumn   + '   ' +   @Sorts   +   ''
)
END


Return   @Total
END

SET   ROWCOUNT   0
SET  NOCOUNT  OFF


 

说明 后面那2节动态SQL 根据SortColumn 是不是等于 PrimaryColumn (主键)进行分别处理,
1.当2个相等时,只要在条件处(where )@SortColumn + @operator +' @SortId ' 即可
2.当主键不等于SortColumn时,就有可能存在 SortColumn列存在多个同值的情况,古可以看到排列语句(Order By)使用的是   ' ORDER BY '+ @SortColumn + ' ' +@Sorts + ',' + @PrimaryColumn + ' '+ @Sorts + '',即主键做为第2排序对象,比方有张表B(SortID,RefTime,Name) 其中SortID为int类型主键,RefTime为刷新时间,那么我们需要按刷新时间到序来分页取数据, 当RefTime没有重复时,where 条件后为@SortColumn + @operator+ @SortCol   即可,但是当RefTime有重复时,我们需要加上 OR ('+ @SortColumn + '= @SortCol AND '+ @PrimaryColumn + @operator +' @SortId ) ,因为按,RefTime DESC,SortID DESC 排列后,如果当前分页存在RefTime相同的记录,那么他们必定符合
@RefTime(分页第一条)>=RefTime And @SortID > SortID 将 >=分开写就是上面存储过程里的代码形式


你可能感兴趣的:(count)