• [轉]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)

     

     

    代码
    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 将 >=分开写就是上面存储过程里的代码形式


  • 相关阅读:
    人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)
    四.redis 事务
    三.redis 排序
    二.redis 数据类型
    一.redis 环境搭建
    Redis几个认识误区
    key-list类型内存数据引擎介绍及使用场景
    牛人推荐机器学习网站
    Android Studio 快捷键整理分享
    人工智能和机器学习领域中有趣的开源项目
  • 原文地址:https://www.cnblogs.com/Athrun/p/1735370.html
Copyright © 2020-2023  润新知