2011-11-18 121 views
2

我想知道你是否可以这样做是微软SQL Server 2k8 R2SQL - 限制结果

说我有一个查询返回100行数据。

他们是我可以传递一些变量的方式,例如@lower_limit和@upper_limit。

然后我想查询记录的下限和上限

之间的行中例如:

@lower_limit = 5 
@upper_limt 10 

会回到我行5 - 10从100条记录。

+0

可能的重复[限制10..20在sqlserver](http://stackoverflow.com/questions/971964/limit-10-20-in-sqlserver) – mellamokb

回答

6

您可以在结果集上指定ROW_NUMBER(),然后使用BETWEEN语句来限制行。

一个人为的例子:

WITH data AS 
(
    SELECT 
     ID 
     ,YourColumn 
     ,ROW_NUMBER() OVER (ORDER BY ID) AS RowNum 
    FROM 
     YourTable 
) 
SELECT 
    * 
FROM 
    data 
WHERE 
    RowNum BETWEEN 5 AND 10 

编辑:对于标准分页,这里正是我在所有的应用中使用的技术我开发:

DECLARE @PageNumber int = /* The page number you want */ 
DECLARE @PageSize int = /* The number of records per page */ 
WITH paged AS 
(
    SELECT 
     ROW_NUMBER() OVER(ORDER BY [OrderByColumns]) AS RowNum 
     ,* 
    FROM 
     [YourSource] 
) 
SELECT 
    [Column1] 
    ,[Column2] 
    ,... 
FROM 
    paged 
WHERE 
    RowNum BETWEEN (@PageNumber - 1) * @PageSize + 1 AND @PageNumber * @PageSize 
ORDER BY 
    [OrderByColumns] -- Same as used in ROW_NUMBER() 
+0

+1绝对!我刚才创建了[一篇文章](http://codecrafter.blogspot.com/2008/08/painful-sql-server-pagination.html)。 –

+0

这是不真实的Cory,非常感谢,比我之前在这里执行这个网站的分页的方式要好得多。 他每次都调用SP,然后限制代码中显示的内容。 – swade1987

+0

@ user1052764:我编辑了我的答案,向您展示了我使用的分页技术。 –

0
select * 
from 
(
    select *, row_number() over(order by someColToOrderBy) RowNum 
    from yourTable 
) a 
where RowNum between @lower_limit and @uppder_limit 
0

像这样的东西应该工作:

SELECT ID, Foo, Bar 
FROM (
      SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS Row, ID, Foo, Bar 
      FROM SomeTable 
     ) 
     tmp 
WHERE Row >= @RowRangeStart AND Row <= @RowRangeEnd