2010-03-21 3 views
0

Je suis en train de mettre en œuvre ce style de pagination:Sql Paging/Tri - Méthode efficace avec tri dynamique?

http://www.4guysfromrolla.com/webtech/042606-1.shtml

CREATE PROCEDURE [dbo].[usp_PageResults_NAI] 
(
@startRowIndex int, 
@maximumRows int 
) 
AS 

DECLARE @first_id int, @startRow int 

-- A check can be added to make sure @startRowIndex isn't > count(1) 
-- from employees before doing any actual work unless it is guaranteed 
-- the caller won't do that 

-- Get the first employeeID for our page of records 
SET ROWCOUNT @startRowIndex 
SELECT @first_id = employeeID FROM employees ORDER BY employeeid 

-- Now, set the row count to MaximumRows and get 
-- all records >= @first_id 
SET ROWCOUNT @maximumRows 

SELECT e.*, d.name as DepartmentName 
FROM employees e 
INNER JOIN Departments D ON 
    e.DepartmentID = d.DepartmentID 
WHERE employeeid >= @first_id 
ORDER BY e.EmployeeID 

SET ROWCOUNT 0 

GO 

Cette méthode fonctionne très bien, cependant, est-il possible d'utiliser cette méthode et avoir champ dynamique de tri?

Si nous changeons cela

SELECT e.*, d.name as DepartmentName 
FROM employees e 
INNER JOIN Departments D ON 
    e.DepartmentID = d.DepartmentID 
WHERE employeeid >= @first_id 
ORDER BY e.FirstName DESC 

Il casse le tri ...

Est-il possible de combiner cette méthode de pagination avec la possibilité de trier sur différents domaines?

Répondre

0

Vous devez suivre à la fois le prénom et l'ID à l'aide de cette méthode. La raison pour laquelle vous devez garder une trace des deux est que le prénom ne peut pas être unique dans votre ensemble de données, donc vous commandez par lui et une valeur unique. La commande par dans la sélection pour le premier enregistrement doit correspondre à la commande par dans la sélection pour le jeu d'enregistrements.

Non testé, mais vous devriez avoir l'idée. Vous devez déclarer @first_first_name comme une variable similaire à ce qui a été fait avec @first_id.

DECLARE @first_first_id VARCHAR(50) -- whatever your first name field size is 
SET ROWCOUNT @startRowIndex 
SELECT @first_id = employeeID, @first_first_name = FirstName FROM employees ORDER BY FirstName DESC, employeeid 

SELECT e.*, d.name as DepartmentName 
FROM employees e 
INNER JOIN Departments D ON 
    e.DepartmentID = d.DepartmentID 
WHERE 
    e.FirstName <= @first_first_name 
    OR (e.FirstName = @first_first_name AND employeeid >= @first_id) 
ORDER BY e.FirstName DESC, employeeid