2010-09-19 39 views
9

Giải pháp phân trang hiệu quả nhất khi sử dụng SQL Server 2005 dựa vào bảng có khoảng 5.000-10.000 hàng là gì? Tôi đã nhìn thấy một số ra có nhưng không có gì so sánh chúng.Giải pháp phân trang tốt nhất bằng SQL Server 2005?

+1

có thể trùng lặp với [ASP.NET, SQL 2005 "hoán trang"] (http://stackoverflow.com/questions/1058825/asp-net-sql-2005-paging) – M4N

+0

Nhiều: http://stackoverflow.com/question/tagged/pagination + sql-server –

Trả lời

22

Đối với bảng có kích thước, hãy sử dụng biểu thức bảng chung (CTE) và ROW_NUMBER; sử dụng một hàm nhỏ để tính toán các bản ghi để mang lại dựa trên các biến số @PageNumber@PageSize (hoặc bất kỳ thứ gì bạn muốn gọi chúng). ví dụ đơn giản từ một trong những thủ tục được lưu trữ của chúng tôi:

-- calculate the record numbers that we need 

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

; 
WITH CTE AS 
(
    SELECT [Fields] 
      , ROW_NUMBER() OVER (ORDER BY [Field] [ASC|DESC]) as RowNumber 
    FROM [Tables] 
    WHERE [Conditions, etc] 
) 
SELECT * 
     -- get the total records so the web layer can work out 
     -- how many pages there are 
     , (SELECT COUNT(*) FROM CTE) AS TotalRecords 
FROM CTE 
WHERE RowNumber BETWEEN @FirstRow AND @LastRow 
ORDER BY RowNumber ASC 
+0

Bạn có phải đợi cho proc chạy một lần trước khi bạn có thể nhận được tổng số trang không? – Caveatrob

+0

PS - điều này đang hoạt động tốt cho đến nay! – Caveatrob

+0

Có - cách chúng tôi làm là sử dụng kết quả của proc để điền một đối tượng PagingInfo nhỏ xử lý quá trình viết ra các liên kết số trang. Giả sử bạn không làm một số lượng điên tham gia hoặc các cuộc gọi chức năng trong truy vấn, em bé này nên chạy gần như ngay lập tức, vì vậy nó không bao giờ là một vấn đề đối với chúng tôi. Rất vui khi nó hoạt động cho bạn :) –

4

Một trong những cuộc thảo luận tốt nhất của kỹ thuật phân trang khác nhau mà tôi từng đọc ở đây: SQL Server 2005 Paging – The Holy Grail. Bạn sẽ phải hoàn tất đăng ký miễn phí trên SQLServerCentral.com để xem bài viết, nhưng cũng rất đáng để đăng ký.

1

Thậm chí điều này sẽ giúp ..

SELECT * FROM 
( 
    SELECT Row_Number() OVER(order by USER_ID) As RowID, 
    COUNT (USER_ID) OVER (PARTITION BY null) AS TOTAL_ROWS, 
    select name from usertbl 
) 
As RowResults WHERE 
RowID Between 0 AND 25 

Không chắc chắn nếu nó tốt hơn so với phiên bản @keith.

Các vấn đề liên quan