專案需求:在預存程序中依傳入參數動態決定 ORDER BY 排序欄位。直接使用變數如 ORDER BY @Parameter DESC 會報錯:「ORDER BY 子句不允許變數指定欄位位置」。
利用動態 SQL 組裝查詢字串再執行:
CREATE PROCEDURE proc_test
@fieldname VARCHAR(50)
AS
BEGIN
DECLARE @sql VARCHAR(1000);
SET @sql = 'SELECT * FROM SiteDetailInfo WHERE SiteBasicId = @SiteId AND SiteIsCheck = 1 ORDER BY ' + QUOTENAME(@fieldname) + ' DESC';
EXEC sp_executesql @sql, N'@SiteId INT', @SiteId = @SiteId;
END
關鍵點:
QUOTENAME() 防止 SQL 注入,確保欄位名稱合法。sp_executesql 參數化查詢,提升計畫重用與安全性。另一種作法是 CASE 運算式,但僅適用於已知有限欄位:
ORDER BY CASE @fieldname
WHEN 'Column1' THEN Column1
WHEN 'Column2' THEN Column2
ELSE Column1 END DESC
動態 SQL 靈活度最高,適用於欄位不固定的情境。