需求:依使用者選擇動態決定查詢排序欄位。利用 CASE 運算式在 ORDER BY 中實現邏輯判斷,再封裝為預存程序提供介面。
DECLARE @OrderKey TINYINT = 2
SELECT CompanyName, ContactName, ContactTitle
FROM Customers
ORDER BY CASE
WHEN @OrderKey = 1 THEN CompanyName
WHEN @OrderKey = 2 THEN ContactName
ELSE ContactTitle
END
CREATE PROCEDURE sp_SelectCustomersDynamicOrder
@OrderKey TINYINT = NULL
AS
SELECT CompanyName, ContactName, ContactTitle
FROM Customers
ORDER BY CASE
WHEN @OrderKey = 1 THEN CompanyName
WHEN @OrderKey = 2 THEN ContactName
ELSE ContactTitle
END
EXEC sp_SelectCustomersDynamicOrder -- 預設 ContactTitle
EXEC sp_SelectCustomersDynamicOrder 1 -- 依 CompanyName
EXEC sp_SelectCustomersDynamicOrder 2 -- 依 ContactName
CASE 所有分支回傳型別必須相容 (隱含轉換)。若排序欄位型別不同 (如 datetime + varchar),需顯式 CAST/CONVERT 統一。CASE 或回傳組合字串 (效能較差)。@OrderKey = NULL 走 ELSE 分支,符合預設排序邏輯。CASE + ORDER BY 是實現動態排序最簡潔的宣告式寫法,適合中小資料量、排序欄位固定集合的場景。大資料量或高頻呼叫時,改用動態 SQL 產生靜態排序以利用索引。