全域變數(Global Variables)是 SQL Server 提供的特殊系統變數,以 @@ 前綴識別,唯讀(部分可透過 SET 間接影響),反映伺服器、連線、交易、錯誤等運行時狀態。精通全域變數是撰寫健壯 T-SQL、有效除錯與效能調校的關鍵技能。
| 分類 | 變數 | 用途與回傳值說明 |
|---|---|---|
| 身分與版本 | @@VERSION | 伺服器版本、處理器架構、建置日期完整字串 |
| @@SERVERNAME | 本地伺服器名稱(可透過 sp_addserver 修改) | |
| @@SERVICENAME | 執行個體服務名稱(MSSQLSERVER 或具名執行個體名) | |
| @@LANGUAGE / @@LANGID | 目前連線語言名稱 / ID | |
| 連線與工作階段 | @@SPID | 目前處理序 ID(對應 sys.sysprocesses.spid) |
| @@CURSOR_ROWS | 游標結果集資料列數(-1 表非同步填充中) | |
| @@FETCH_STATUS | 上次 FETCH 狀態:0 成功、-1 失敗/超出範圍、-2 資料列遺失 | |
| @@OPTIONS | 目前 SET 選項位元組合(ANSI_NULLS, QUOTED_IDENTIFIER 等) | |
| @@DATEFIRST / @@DATEFORMAT | 每週第一天設定 / 日期格式 | |
| 交易與鎖定 | @@TRANCOUNT | 目前交易巢狀層級(BEGIN TRAN 遞增,COMMIT/ROLLBACK 遞減) |
| @@LOCK_TIMEOUT | 鎖定等待逾時毫秒數(-1 表無限等待) | |
| @@DEADLOCK | 死鎖偵測相關(較新版本擴充) | |
| @@NESTLEVEL | 預存程序/觸發器呼叫巢狀層級(上限 32) | |
| @@PROCID | 目前執行預存程序物件 ID | |
| 錯誤與資料列 | @@ERROR | 上次陳述式錯誤號(0 表成功,每句重置,需立即捕獲) |
| @@ROWCOUNT | 上次陳述式影響資料列數(SELECT/INSERT/UPDATE/DELETE 皆更新) | |
| @@IDENTITY | 上次插入產生的身分值(跨表/觸發器範圍,慎用) | |
| SCOPE_IDENTITY() | 函數非變數:當前範圍內最新身分值(推薦替代 @@IDENTITY) | |
| 資料列偏移與游標 | @@CURSOR_ROWS | 游標資料列計數 |
| @@FETCH_STATUS | FETCH 操作結果狀態 | |
| @@MAX_CONNECTIONS | 允許最大同時連線數 |
BEGIN TRY
-- 高風險操作
INSERT ...
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrNo, ERROR_MESSAGE() AS ErrMsg;
-- 或舊版相容模式
IF @@ERROR <> 0 BEGIN ... END
END CATCH
IF @@TRANCOUNT = 0 BEGIN TRANSACTION;
-- 業務邏輯
IF @@TRANCOUNT > 0 COMMIT TRANSACTION;
INSERT INTO Orders ...;
DECLARE @NewOrderID int = SCOPE_IDENTITY(); -- 推薦
-- 避免使用 @@IDENTITY(觸發器插入其他表會汙染)
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM cur INTO @var;
-- 處理邏輯
END
全域變數是 T-SQL 運行時的「儀表板」。熟練運用 @@ERROR、@@ROWCOUNT、@@TRANCOUNT、SCOPE_IDENTITY() 等核心指標,能寫出更可靠、可觀測、可維護的資料庫程式碼。