BEGIN
-- 多條 T-SQL 陳述式視為單一單位
SELECT 1;
SELECT 2;
END
常用於 IF/WHILE 內包含多行邏輯,可巢狀。
IF @score >= 60
PRINT '及格';
ELSE
PRINT '不及格';
多行必須用 BEGIN...END 包裹。
IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'Users')
DROP TABLE Users;
IF NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = 'TestDB')
CREATE DATABASE TestDB;
比 COUNT(*) > 0 效率高:找到第一筆即停止。
CASE @grade
WHEN 'A' THEN '優'
WHEN 'B' THEN '良'
ELSE '需加強'
END
CASE
WHEN @score >= 90 THEN 'A'
WHEN @score >= 80 THEN 'B'
WHEN @score >= 60 THEN 'C'
ELSE 'D'
END
避免多層 IF 巢狀,可直接用於 SELECT/SET/WHERE/ORDER BY。
DECLARE @i INT = 1;
WHILE @i <= 10
BEGIN
PRINT @i;
SET @i += 1;
IF @i = 5 BREAK; -- 跳出迴圈
IF @i = 3 CONTINUE; -- 跳過本輪剩餘
END
GOTO ErrorHandler;
-- ...
ErrorHandler:
PRINT '錯誤處理';
標籤需以冒號結尾,慎用以免產生義大利麵條代碼。
CREATE PROC TestReturn @val INT
AS
BEGIN
IF @val < 0 RETURN -1; -- 結束程序,返回 -1
SELECT @val * 2;
RETURN 0;
END
可從批次、SP、觸發器無條件退出,後續碼不執行。
-- 等待 10 秒
WAITFOR DELAY '00:00:10';
PRINT '10 秒後執行';
-- 等待至指定時間
WAITFOR TIME '23:59:59';
PRINT '跨年倒數';
時間格式 HH:MM:SS,最大延遲 24 小時,無法指定日期。