SELECT * FROM (
 SELECT ROW_NUMBER() OVER(ORDER BY ProductID ASC) RowNum, * FROM Production.Product ) OrderData
 WHERE RowNum BETWEEN @iRowCount*(@iPageNo-1)+1 and @iRowCount*@iPageNo
 ORDER BY ProductID ASC其中
 SELECT ROW_NUMBER() OVER(ORDER BY ProductID ASC) RowNum, * FROM Production.Product
是什么意思?
Production.Product是一个表还是表中的字段?
RowNum是默认的吗?还是别名?
WHERE RowNum BETWEEN中的RowNum不要改为OrderData.RowNum吗?

解决方案 »

  1.   


    返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 Transact-SQL 语法约定语法
     
    ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] <order_by_clause> )
     备注
    ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。参数
    <partition_by_clause> 将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。 <order_by_clause>确定将 ROW_NUMBER 值分配给分区中的行的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。有关详细信息,请参阅 OVER 子句 (Transact-SQL)。返回类型
    bigint 
      

  2.   

    OVER 子句:确定在应用关联的窗口函数之前,行集的分区和排序。适用范围: 排名窗口函数聚合窗口函数。有关详细信息,请参阅聚合函数 Transact-SQL 语法约定语法
     
    Ranking Window Functions 
    < OVER_CLAUSE > :: =
        OVER ( [ PARTITION BY value_expression , ... [ n ] ]
               <ORDER BY_Clause> )Aggregate Window Functions 
    < OVER_CLAUSE > :: = 
        OVER ( [ PARTITION BY value_expression , ... [ n ] ] ) 备注
    可以在单个查询中将多个排名或聚合窗口函数与单个 FROM 子句一起使用。但是,每个函数的 OVER 子句在分区和排序上可能不同。参数
    PARTITION BY 将结果集分为多个分区。窗口函数分别应用于每个分区,并为每个分区重新启动计算。value_expression 指定对相应 FROM 子句生成的行集进行分区所依的列。<value_expression> 只能引用 FROM 子句可用的列。不能引用选择列表中的表达式或别名。<ORDER BY 子句> 指定应用排名窗口函数的顺序。有关详细信息,请参阅 ORDER BY 子句 (Transact-SQL)。
      

  3.   

    这是2005的写法
    ROW_NUMBER()是获得记录号的写法,OVER(...)指定分组和排序,RowNum是别名
    Production.Product是一个表,其中Production是架构名
    WHERE RowNum BETWEEN中的RowNum可以改为OrderData.RowNum,也可以不改忙因为查询的这一层只有一个子查询,不指定别名也不会有影响
      

  4.   

    如果不用orderby
    可以这样吗
    SELECT * FROM Production.Product
     WHERE ROW_NUMBER() BETWEEN @iRowCount*(@iPageNo-1)+1 and @iRowCount*@iPageNo
     ORDER BY ProductID ASC
      

  5.   

    select  ROW_NUMBER() from table能不能得到一列id?
      

  6.   

    如果 select  ROW_NUMBER from table能不能得到一列id就好了,呵呵