2011-11-18 166 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