設計模式不僅屬於物件導向語言。在 T-SQL 中識別並套用固定模式,能提升程式碼可讀性、維護性與效能穩定性。本文深度解析三大核心模式:Iterator (迭代)、Intersector (交集/聯結)、Qualifier (限定/篩選),並對比新舊寫法優劣。
DECLARE tables CURSOR
FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
FOR READ ONLY; -- 唯讀游標減少鎖負擔
DECLARE @table VARCHAR(128);
OPEN tables;
FETCH NEXT FROM tables INTO @table; -- 建議使用 FETCH NEXT
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_help @table; -- 業務邏輯
FETCH NEXT FROM tables INTO @table;
END
CLOSE tables; -- 對應 OPEN
DEALLOCATE tables; -- 對應 DECLARE,釋放記憶體結構
sp_msforeachdb/sp_msforeachtable 系統程序,應優先嘗試。SELECT c.companyname, o.orderid
FROM customer c
INNER JOIN orders o ON c.customerid = o.customerid;
-- 反面教材
SELECT c.companyname, o.orderid
FROM customer c, orders o
WHERE c.customerid = o.customerid;
*=, =*) 模稜兩可,易產生錯誤結果 (如 Cartesian Product 與 Outer Join 混淆)。針對表值函數、XML 節點展開、動態衍生資料集,提供「行級聯結」能力,屬於 Intersector 模式的現代擴充。
SELECT city, COUNT(*) AS NumberCity
FROM customers
WHERE city LIKE 'A%'
GROUP BY city;
SELECT city, COUNT(*) AS NumberCity
FROM customers
GROUP BY city
HAVING city LIKE 'A%';
HAVING COUNT(*) > 100),濫用於列篩選違反語意。列級篩選用 WHERE,群組級篩選用 HAVING,切勿混淆。
| 模式 | 核心意圖 | 關鍵技術 | 避坑指南 |
|---|---|---|---|
| Iterator | 逐行處理不可集合化邏輯 | CURSOR (READ_ONLY, FAST_FORWARD) | 能用集合操作絕不游標;嚴格 CLOSE/DEALLOCATE |
| Intersector | 表與表的關聯語意表達 | ANSI JOIN (INNER/OUTER/CROSS APPLY) | 禁用舊式 WHERE 聯結與 *= 語法 |
| Qualifier | 精準限定資料範圍 | WHERE (列級) / HAVING (群組級) | HAVING 僅用於聚合後條件 |
內化這三大模式,配合 Set-based 思維、執行計畫分析、參數化查詢,即可寫出高效、穩健、可維護的企業級 T-SQL 程式碼。