三、用列號作為參數
就象第一個方案所顯示地那樣,你也許更喜歡用列的編號作為參數,而不是使用列的名字(列的編號即一個代表你想要作為排序依據的列的數字)。這種方法的基本思想與使用列名字作為參數的思想一樣:CASE表達式根據指定的列號確定使用哪一個列進行排序。Listing 7顯示了修改後的GetSortedShippers存儲過程。
【Listing 7:用列號作為參數】
ALTER PROC GetSortedShippers
@ColNumber AS int
AS
SELECT *
FROM Shippers
ORDER BY
CASE @ColNumber
WHEN 1 THEN CASE SIGN(ShipperID)
WHEN -1 THEN '-'
WHEN 0 THEN '+'
WHEN 1 THEN '+'
ELSE NULL
END +
RIGHT(REPLICATE('0', 10) +
CAST(ABS(ShipperID) AS varchar(10)), 10)
WHEN 2 THEN CompanyName
WHEN 3 THEN Phone
ELSE NULL
END
當然,在這裡你也可以使用Richard的方法,避免ORDER BY子句中列數據類型帶來的問題。如果要根據ShipperID排序輸出,你可以按照下面的方式調用修改後的GetSortedShippers存儲過程:
EXEC GetSortedShippers 1