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

SQL Server 流程控制語句精通:IF...ELSE、BEGIN...END、CASE、WHILE 完整語法與巢狀邏輯實戰

     編輯:關於SqlServer

T-SQL 流程控制語句賦予預存程式、批次指令、動態 SQL 程式設計能力。掌握 IF...ELSE、BEGIN...END、CASE、WHILE 的語法細節、巢狀限制、布林邏輯評估順序,能撰寫出健壯且可維護的程序式邏輯。

IF...ELSE 條件分支

IF <布林運算式>
    <陳述式或區塊>
[ELSE
    <陳述式或區塊>]
  • 條件運算式必須回傳 TRUE/FALSE/UNKNOWN (三值邏輯)。
  • 無 BEGIN...END 時,IF/ELSE 僅控制緊隨其後的單一陳述式。
  • 支援巢狀,最大 32 層 (SQL 2000)。
  • 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 區塊界定

BEGIN
    <陳述式清單>
END
  • 將多條陳述式視為單一執行單元,常搭配 IF...ELSE、WHILE 使用。
  • 支援巢狀區塊,建立清晰的語法結構層次。
  • 區塊內宣告的變數作用域延伸至區塊結束。

CASE 條件運算式 (兩種形式)

簡單 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 迴圈

WHILE <布林運算式>
BEGIN
    <陳述式區塊>
    [BREAK] -- 跳出迴圈
    [CONTINUE] -- 跳過本次迭代進入下一次判斷
END
  • 條件為 TRUE 時持續執行區塊,區塊內必須修改條件相關狀態以避免無限迴圈。
  • 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、行政自動化、複雜業務規則無法集合化時才使用流程控制。

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