2012-09-11 27 views
5

Tôi có một truy vấn trong SQL Server 2012 sẽ lấy lại một số bản ghi dựa trên kích thước trang mà tôi chỉ định và trang nó đang bật. Có vẻ như sau:Offset Fetch Next để nhận tất cả các hàng

 

SELECT LocID, LocName 
FROM Locations 
ORDER BY LocName OFFSET @PageNum ROWS 
FETCH NEXT @PageSize ROWS ONLY 
 

Mã này khá đơn giản. Những gì tôi cần làm, tuy nhiên, được đặt vào một hàm để trả về phân trang chính xác. Tuy nhiên, tôi cũng có thể cần tất cả các bản ghi từ hàm này, vì vậy tôi cần có tùy chọn gọi hàm mà không có bất kỳ OFFSET hoặc FETCH nào (chủ yếu, đây là báo cáo không có phân trang và chỉ nên là dữ liệu thẳng) . Tôi không thể nghĩ ra cách tốt để làm điều này.

+0

Tại sao không chỉ gọi nó bằng '@ PageSize' đủ lớn để trả về tất cả các bản ghi? –

+1

Vấn đề là, tôi không biết làm thế nào lớn các thiết lập kỷ lục là có được cho đến sau khi tôi đã chạy nó. Tôi cũng có một câu hỏi khác về vấn đề tương tự như vấn đề đó. – CrystalBlue

+2

Giới hạn trên của INT hoặc BIGINT phải đủ, tùy thuộc ... –

Trả lời

7

Bạn có thể nói:

@PageNum INT, 
@PageSize INT 

... 

SELECT @PageSize = COALESCE(@PageSize, 2000000000); 
-- 2 billion should be enough? 

... OFFSET (COALESCE(@PageNum, 1)-1)*@PageSize ROWS 
FETCH NEXT @PageSize ROWS ONLY; 

Khi bạn chỉ muốn tất cả các hàng, vượt qua trong NULL cho cả hai tham số.

+0

Đây là những gì tôi đã được đề xuất để làm bởi những người khác cho bây giờ, do đó, điều này có vẻ như câu trả lời hợp lệ nhất. Cảm ơn! – CrystalBlue

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