with xxx as 
(
     select threadid, ROW_NUMBER() OVER (order by stickydate) as Pos from cs_threads
)
select * from xxx
where Pos > 100000 and Pos < 100030

解决方案 »

  1.   

    没用过SQL Server 2005,感觉他的分析函数跟Oracle很类似。
    楼上的SQL语句语法没有错误吧?
    ROW_NUMBER() OVER (order by stickydate) as Pos 
    -------------------------------------------------------------------------------------
    按照stickydate字段排序,编号自1开始顺序排列,为该列取别名为Pos
    余下部分的SQL语句很好理解,就是一个对子查询结果按范围取值的操作。
      

  2.   

    row_number函数是SQL2005 rank函数集中比较重要的一个。它有点类似oracle的rownumber。但是它比oracle的rownumber在嵌套查询方面更方便一点。有了row_number函数分页就可以不用使用临时表或表变量提供顺序号了!效率提高很多!摘抄自帮助文件:《-------------------------------------
    ROW_NUMBER (Transact-SQL)   返回结果集分区内行的序列号,每个分区的第一行从 1 开始。Transact-SQL 语法约定
    语法 复制到剪贴板ROW_NUMBER ( )     OVER ( [ <partition_by_clause> ] &lorder_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 示例以下示例将根据年初至今的销售额,返回 AdventureWorks 中销售人员的 ROW_NUMBER。
    SELECT c.FirstName, c.LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', s.SalesYTD, a.PostalCode
    FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
    JOIN Person.Address a ON a.AddressID = c.ContactID
    WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0
    以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。
    WITH OrderedOrders AS
    (SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (order by OrderDate)as RowNumber
    FROM Sales.SalesOrderHeader ) 
    SELECT * 
    FROM OrderedOrders 
    WHERE RowNumber between 50 and 60;-----------------------》
      

  3.   

    viptiger(六嘎),用的是CTE也是新特性。
      

  4.   

    如果现在我有一简单的 Select * Form 表 数据量大翻页慢,那上面的句子该怎么写?没用存储过程。
      

  5.   

    "如果现在我有一简单的 Select * Form 表 数据量大翻页慢,那上面的句子该怎么写?"就是在你的select fieldliset中增加一个row_number的列, 再通过子查询或者cte封装在条件中引用row_number列做条件.因为row_number不能直接用于条件, 所以得用子查询或者cte包装一下.
      

  6.   

    我做了个2005的分页程序,只是把原来的临时表生成序号部分改成了row_number了。效率还可以。由于动态SQL用CTE太麻烦,所以还是用的子查询。