超長 SQL 陳述式中,同一日期常值 '20120801' 重複出現數十處。若需修改日期,逐一替換極易遺漏且難以維護。
將常值提升為衍生表的輸出欄位,外層查詢直接引用該欄位別名,實現「一處定義、多處引用」。
SELECT
(SELECT ... WHERE tradedate = '20120801' ...),
(SELECT ... WHERE tradedate = '20120801' ...),
...
FROM (
SELECT b.scode, b.fund5, b.fund4, b.fund10
FROM sdc_fundbase b ...
WHERE b.scode IN (...) AND ...
) sf
...
SELECT
(SELECT ... WHERE tradedate = base.tdate ...),
(SELECT ... WHERE tradedate = base.tdate ...),
...
FROM (
SELECT
b.scode, b.fund5, b.fund4, b.fund10,
20120801 AS tdate -- ★ 這裡只寫一次常值
FROM sdc_fundbase b ...
WHERE b.scode IN (...) AND ...
) base
...
CREATE PROCEDURE dbo.sp_FundReport @RptDate INT = 20120801
AS
BEGIN
SELECT
(SELECT ... WHERE tradedate = base.tdate ...),
...
FROM (
SELECT b.scode, b.fund5, b.fund4, b.fund10, @RptDate AS tdate
FROM sdc_fundbase b ...
) base
...
END
呼叫端僅需 EXEC sp_FundReport 20231201,完全消除硬編碼。
tdate 取代神秘數字。任何重複出現的常值:日期、狀態碼、分類 ID、閾值常數等。原則:超過 2 次重複即提煉為欄位/變數。
「在最內層衍生表引入常數欄位」是重構超長 SQL、消除魔術數字的極簡模式,零效能損耗、極大降低維護成本,建議列入團隊 SQL 編碼規範。