Базы данных на стороне базы данных - PullRequest
1 голос
/ 19 марта 2011

Мне нужно использовать подкачку на стороне базы данных, например, если в таблице 10 000 записей, мне нужно сначала выполнить 100 записей, а затем еще 100 записей. Я использую SQL Server 2005. Пожалуйста, предоставьте код хранимой процедуры для этого.

Ответы [ 4 ]

2 голосов
/ 13 марта 2012
DECLARE @PageSize INT,  
    @PageNumber INT,  
    @FirstRow INT,  
    @LastRow INT  

SELECT  @PageSize = 20,  
          @PageNumber = 1     


SELECT  @FirstRow = ( @PageNumber - 1) * @PageSize + 1,  
    @LastRow = (@PageNumber - 1) * @PageSize + @PageSize ;  

WITH Members  AS  
(  
    SELECT  Col1,Col2,Col3,  
            ROW_NUMBER() OVER (ORDER BY Col1 DESC) AS RowNumber  
                FROM    Table  
)  
SELECT  Col1,Col2,..,..,..,
FROM    Members  
WHERE   RowNumber BETWEEN @FirstRow AND @LastRow  
ORDER BY Col1 ASC;  
2 голосов
/ 19 марта 2011

Вы должны взглянуть на функцию ROW_NUMBER () , доступную с SQL Server 2005.

Оказалось, что это самый эффективный (в моем случае) способ подкачки на стороне сервера.

Пример:

SELECT *
FROM (
    SELECT col1, col2, col3,
           ROW_NUMBER() OVER(ORDER BY col1 ASC) AS rownbr
    FROM table
    WHERE col2 = 'something'
) AS Query
WHERE rownbr BETWEEN 1 AND 10
ORDER BY rownbr

Вы можете установить столбцы, по которым вы хотите упорядочить, в операторе OVER (), а также первую и последнюю строки, которые вы хотите получить во внешнем операторе WHERE.

1 голос
/ 21 марта 2011

Как предположили Джейсон и Томас, функция ROW_NUMBER () - ваш лучший выбор. Но если число записей, удовлетворяющих предложению WHERE, очень велико, вы можете просто получить первичный ключ и затем снова объединить подмножество с той же таблицей, чтобы получить другие столбцы.

Например:

SELECT e.col1, e.col2, e.col3
FROM Table1 e
JOIN 
(SELECT ID, rownum= ROW_NUMBER()
FROM Table1
WHERE col1 = @filterParam
ORDER BY LastName) 
f ON f.ID = e.ID
WHERE f.rownum BETWEEN 100 AND 150
1 голос
/ 19 марта 2011

Если вы на самом деле пытаетесь создать страницу с номерами страниц, то вы можете сделать что-то вроде следующего:

Create Procedure GetPagedStuff( @PageNumber int, @PageSize int )
As

;With RankedRows As
    (
    Select ...
        , Row_Number() Over ( Order By SomeColumn ) As Num
        , Count( NonNullColumn ) Over() As TotalRows
    From MyTable
    )
Select ...
From RankedRows
Where Num > (@PageNumber - 1) * @PageSize
    And Num <= @PageNumber * @PageSize

Return

-- example call
Exec GetPagedStuff @PageNumber = 1, @PageSize = 100
...