Khi tôi cần phân trang, tôi thường sử dụng bảng tạm thời. Bạn có thể sử dụng tham số đầu ra để trả về tổng số bản ghi. Các câu lệnh case trong select cho phép bạn sắp xếp dữ liệu trên các cột cụ thể mà không cần phải sử dụng SQL động.
--Declaration--
--Variables
@StartIndex INT,
@PageSize INT,
@SortColumn VARCHAR(50),
@SortDirection CHAR(3),
@Results INT OUTPUT
--Statements--
SELECT @Results = COUNT(ID) FROM Customers
WHERE FirstName LIKE '%a%'
SET @StartIndex = @StartIndex - 1 --Either do this here or in code, but be consistent
CREATE TABLE #Page(ROW INT IDENTITY(1,1) NOT NULL, id INT, sorting_1 SQL_VARIANT, sorting_2 SQL_VARIANT)
INSERT INTO #Page(ID, sorting_1, sorting_2)
SELECT TOP (@StartIndex + @PageSize)
ID,
CASE
WHEN @SortColumn='FirstName' AND @SortDirection='ASC' THEN CAST(FirstName AS SQL_VARIANT)
WHEN @SortColumn='LastName' AND @SortDirection='ASC' THEN CAST(LastName AS SQL_VARIANT)
ELSE NULL
END AS sort_1,
CASE
WHEN @SortColumn='FirstName' AND @SortDirection='DES' THEN CAST(FirstName AS SQL_VARIANT)
WHEN @SortColumn='LastName' AND @SortDirection='DES' THEN CAST(LastName AS SQL_VARIANT)
ELSE NULL
END AS sort_2
FROM (
SELECT
CustomerId AS ID,
FirstName,
LastName
FROM Customers
WHERE
FirstName LIKE '%a%'
) C
ORDER BY sort_1 ASC, sort_2 DESC, ID ASC;
SELECT
ID,
Customers.FirstName,
Customers.LastName
FROM #Page
INNER JOIN Customers ON
ID = Customers.CustomerId
WHERE ROW > @StartIndex AND ROW <= (@StartIndex + @PageSize)
ORDER BY ROW ASC
DROP TABLE #Page
Nguồn
2008-09-16 16:17:24
Tuyệt vời, ví dụ đơn giản Pat - chính xác những gì tôi đã sau :) – Town
Câu trả lời này không hiệu quả đối với tôi, mặc dù nó đã giúp tôi gần gũi hơn. Nó phàn nàn rằng nó không biết RowID là gì. Xem câu trả lời của tôi bên dưới để biết thêm thông tin, nếu bạn có cùng một vấn đề. – Beska
Trong lựa chọn bên trong, bạn có thể chọn các hàng TOP X (X = hàng tối đa muốn, trong trường hợp này - 10). Nó sẽ cải thiện tốc độ truy vấn. – Faruz