2010-03-21 68 views
0

我试图实现这种风格分页:Sql寻呼/排序 - 动态排序的有效方法?

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 

此方法效果很好,但是,它可以使用此方法,并具有动态字段排序?

如果我们将其更改为

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 

它打破了排序...

有没有什么办法来寻呼此方法进行排序不同领域的能力结合起来?

回答

0

您需要使用此方法跟踪名字和ID。你必须跟踪两者的原因是,名字在你的数据集中可能并不是唯一的,所以你可以通过它订购一个独特的价值。选择第一条记录的顺序必须与选择记录集的顺序相匹配。

未经测试,但您应该明白。您需要将@first_first_name声明为类似于@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