修改預存程序接收欄位名稱參數,CASE 運算式決定 ORDER BY 使用哪個欄位:
CREATE PROC GetSortedShippers
@ColName sysname
AS
SELECT * FROM Shippers
ORDER BY
CASE @ColName
WHEN 'ShipperID' THEN ShipperID
WHEN 'CompanyName' THEN CompanyName
WHEN 'Phone' THEN Phone
ELSE NULL
END;
測試 EXEC GetSortedShippers 'CompanyName' 失敗,錯誤:
Syntax error converting the nvarchar value 'Speedy Express' to a column of data type int.
原因:CASE 運算式回傳型別由最高優先權決定。int (ShipperID) 優先權高於 nvarchar (CompanyName, Phone),導致隱含轉換失敗。
將數值欄位轉換為 varchar,使 nvarchar 成為最高優先權:
ALTER PROC GetSortedShippers
@ColName sysname
AS
SELECT * FROM Shippers
ORDER BY
CASE @ColName
WHEN 'ShipperID' THEN CAST(ShipperID AS varchar(11))
WHEN 'CompanyName' THEN CompanyName
WHEN 'Phone' THEN Phone
ELSE NULL
END;
三個參數皆正確排序。但注意:ShipperID 轉字串後按字典序排序(1, 10, 2...),若需數值序需額外處理(如左補零)。
以欄位名稱參數動態排序靈活,但必須處理 CASE 運算式資料類型優先權問題,統一轉換為相容型別為關鍵。