掌握 T-SQL 程式設計基礎,是撰寫高效預存程序、觸發器與批次腳本的關鍵。本文系統整理全域/區域變數、資料型別轉換、流程控制(IF/WHILE/CASE)、輸出列印與批次處理(GO)等核心語法,並附上實戰範例。
以 @@ 為前綴,唯讀,由系統維護。常用清單:
| 變數 | 用途 | 範例結果 |
|---|---|---|
@@VERSION | SQL Server 版本資訊 | Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) |
@@IDENTITY | 最後一條 INSERT 產生的識別欄值 | 5 |
@@ROWCOUNT | 上一條語句影響的資料列數 | 1 |
@@SERVERNAME | 本地伺服器名稱 | DESKTOP-M5OLTTN |
@@ERROR | 最後一條語句的錯誤號 | 109(欄位數不符) |
@@SERVICENAME | SQL Server 服務名稱 | MSSQLSERVER |
@@LANGUAGE | 目前語言環境 | 繁體中文 |
@@MAX_CONNECTIONS | 最大同時連線數 | 32767 |
@@TIMETICKS | 每微秒刻度數 | 31250 |
@@TRANCOUNT | 目前連線開啟的交易數 | 0 |
DECLARE @var INT; -- 宣告
SET @var = 100; -- 單一賦值,效能較好
SELECT @var = 200; -- 可同時賦值多個變數,或從資料表取值
差異重點:SET 為 ANSI 標準,單次賦值效能優;SELECT 可從資料表查詢賦值,支援多變數同步賦值。
PRINT @var 或 PRINT '訊息':單純列印字串/變數SELECT @var 或 SELECT '訊息':以結果集形式輸出,可攜帶欄位名稱CAST (運算式 AS 資料類型)
CONVERT (資料類型, 運算式 [, 樣式]) -- 樣式可選,如日期格式 120 = yyyy-mm-dd hh:mi:ss
相當於 C# 的 { },可巢狀嵌套。
IF @score >= 60
PRINT '及格';
ELSE
PRINT '不及格';
WHILE @i < 10
BEGIN
SET @i += 1;
PRINT @i;
END
CASE
WHEN @grade = 'A' THEN '優'
WHEN @grade = 'B' THEN '良'
ELSE '需加強'
END
注意:若無 ELSE 且所有 WHEN 均不成立,回傳 NULL。
GO 非 T-SQL 指令,而是 SSMS/sqlcmd 的批次分隔符號。一個批次內的語句會被編譯成單一執行單元,減少編譯開銷。變數作用域不跨越 GO。
@@ROWCOUNT、@@ERROR 做錯誤處理與流程控制SET,需查表賦值才用 SELECTCASE 運算式可直接嵌入 SELECT/UPDATE,避免程序式寫法GO 分批,避免單一批次過大導致記憶體壓力