2011-02-23 73 views
1

我發現this nice example在SQL Server中做分頁,但是,我需要做一些動態排序。也就是說,在一個整數用戶通過,然後把它用來做排序,像這樣:SQL Server分頁,動態排序?

ORDER BY 
    CASE WHEN @orderBy = 1 THEN DateDiff(ss, getdate(), received_date) --oldest 
     WHEN @orderBy = 2 THEN DateDiff(ss, received_date, getdate()) --newest 
     WHEN @orderBy = 3 THEN message_id --messageid 
     WHEN @orderBy = 4 THEN LEFT(person_reference, LEN(person_reference)-1) --personid 
    END 

是否有可能做尋呼,這種形式的動態排序的?

+0

什麼都不起作用? – 2011-02-23 00:24:43

+0

是的,這是可能的。 – 2011-02-23 00:26:07

回答

4

你要做的是將ORDER BY代碼移動到ROW_NUMBER窗口函數中。

像這個例子

SELECT * -- your columns 
FROM 
(
    SELECT *, ROWNUM = ROW_NUMBER() OVER (
    ORDER BY 
     CASE WHEN @orderBy = 1 THEN DateDiff(ss, getdate(), received_date) --oldest 
      WHEN @orderBy = 2 THEN DateDiff(ss, received_date, getdate()) --newest 
      WHEN @orderBy = 3 THEN message_id --messageid 
      WHEN @orderBy = 4 THEN LEFT(person_reference, LEN(person_reference)-1) --personid 
     END 
    ) 
    FROM TBL 

) R 
where ROWNUM between ((@pageNumber-1)*@PageSize +1) and (@pageNumber*@PageSize) 

的主要問題與複雜的ORDER BY和窗口功能,你最終只返回一個頁面之前完全物化針對所有行的ROWNUM。

+0

謝謝理查德。是的,你對整桌的警告是我所害怕的。這有點像將整個表格選入臨時表格,排序,然後選擇'位於'位。所以,我猜,對數據庫來說很苛刻。我相信更好的分頁函數將在下一個SQL Server中出現... – Craig 2011-02-23 01:16:59