T-SQL 流程控制語句賦予預存程式、批次指令、動態 SQL 程式設計能力。掌握 IF...ELSE、BEGIN...END、CASE、WHILE 的語法細節、巢狀限制、布林邏輯評估順序,能撰寫出健壯且可維護的程序式邏輯。
IF <布林運算式>
<陳述式或區塊>
[ELSE
<陳述式或區塊>]
BEGIN...END 時,IF/ELSE 僅控制緊隨其後的單一陳述式。ELSE IF 實為巢狀 IF,非獨立關鍵字。範例 4-9:
DECLARE @x int=1, @y int=2, @z int=3;
IF @x > @y
PRINT 'x>y';
ELSE IF @y > @z
PRINT 'y>z';
ELSE
PRINT 'z>y'; -- 輸出: z>y
BEGIN
<陳述式清單>
END
IF...ELSE、WHILE 使用。簡單 CASE (運算式比較):
CASE <輸入運算式>
WHEN <比較運算式> THEN <結果運算式>
[ ...n ]
[ELSE <結果運算式>]
END
搜尋 CASE (布林運算式):
CASE
WHEN <布林運算式> THEN <結果運算式>
[ ...n ]
[ELSE <結果運算式>]
END
SELECT、WHERE、ORDER BY、SET 等任何運算式允許處。WHEN,首個 TRUE 即回傳對應 THEN 結果,後續不再評估 (短路)。ELSE 且所有 WHEN 皆 FALSE → 回傳 NULL。THEN/ELSE 結果運算式必須隱含轉換為相容資料型別 (資料型別優先順序規則)。WHILE <布林運算式>
BEGIN
<陳述式區塊>
[BREAK] -- 跳出迴圈
[CONTINUE] -- 跳過本次迭代進入下一次判斷
END
BREAK 立即離開最內層 WHILE;CONTINUE 跳至條件判斷點。DECLARE @i int = 1, @sql nvarchar(max);
WHILE @i <= 12
BEGIN
SET @sql = N'CREATE TABLE Sales_2024_' + RIGHT('0'+CAST(@i AS varchar(2)),2) +
N' (SaleID bigint IDENTITY, SaleDate date, Amount money) ON FG_' + CAST(@i AS varchar(2));
EXEC sp_executesql @sql;
SET @i += 1;
END
| 陷阱 | 正確做法 |
|---|---|
| IF 後直接寫多行未加 BEGIN/END | 永遠使用 BEGIN...END 區塊,即使單行也建議加上 |
| 布林運算式包含 NULL 導致 UNKNOWN | 使用 IS NULL/IS NOT NULL 明確處理,或用 COALESCE/ISNULL 預設值 |
| CASE 結果型別不一致 (int/varchar 混用) | 統一 CAST/CONVERT 至最高優先順序型別 (如 varchar(max)) |
| WHILE 迴圈缺少 BREAK 條件 | 設定最大迭代次數保護變數,超限則 BREAK 並記錄錯誤 |
| 巢狀超過 32 層 | 重構邏輯:拆分為多個預存程式、使用集合式思維替代程序式迴圈 |
流程控制是程序式 T-SQL 的靈魂,但記住:集合式操作 (JOIN/WHERE/GROUP BY) 永遠優於逐列迴圈。僅在動態 DDL、行政自動化、複雜業務規則無法集合化時才使用流程控制。