首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 查詢參數過多時:以變數替換重複常值簡化維護

     編輯:關於SqlServer

痛點場景

超長 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 取代神秘數字。
  • 易於參數化:自然過渡至預存程序參數或動態 SQL 參數。

適用範圍

任何重複出現的常值:日期、狀態碼、分類 ID、閾值常數等。原則:超過 2 次重複即提煉為欄位/變數。

結語

「在最內層衍生表引入常數欄位」是重構超長 SQL、消除魔術數字的極簡模式,零效能損耗、極大降低維護成本,建議列入團隊 SQL 編碼規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved