什麼是全域變數?
SQL Server 2000 提供一組以 @@ 為前綴的系統全域變數,由伺服器自動維護,提供系統狀態、環境資訊、效能計數等關鍵資訊。唯讀(少數可透過 SET 指令間接影響),不可由使用者直接賦值。
分類詳細列表
連線與工作階段資訊
| 變數 | 說明 |
@@CONNECTIONS | 啟動以來嘗試連線總數 |
@@MAX_CONNECTIONS | 允許最大同時連線數 |
@@SPID | 目前工作階段的伺服器處理序 ID |
@@REMSERVER | 遠端伺服器名稱 |
錯誤與診斷
| 變數 | 說明 |
@@ERROR | 上一條 T-SQL 陳述式錯誤碼(0=成功) |
@@FETCH_STATUS | 上一個 FETCH 陳述式狀態(0=成功,-1=失敗,-2=資料列遺失) |
@@ROWCOUNT | 上一陳述式影響的資料列數 |
@@TRANCOUNT | 目前連線中作用中交易數 |
身分識別與版本
| 變數 | 說明 |
@@IDENTITY | 最後插入資料列的身分識別欄位值(跨表、觸發器皆影響) |
@@VERSION | SQL Server 版本、處理器、建置日期資訊 |
@@SERVERNAME | 本地伺服器名稱 |
@@SERVICENAME | 服務名稱(如 MSSQLSERVER、MSSQL$InstanceName) |
效能與資源監控
| 變數 | 說明 |
@@CPU_BUSY | CPU 忙碌時間(毫秒,啟動以來累計) |
@@IDLE | CPU 閒置時間(毫秒) |
@@IO_BUSY | CPU 執行 I/O 操作時間(毫秒) |
@@PACK_RECEIVED | 網路接收封包數 |
@@PACK_SENT | | 網路發送封包數 |
@@PACKET_ERRORS | 網路封包錯誤數 |
@@TOTAL_READ | 磁碟讀取作業數 |
@@TOTAL_WRITE | 磁碟寫入作業數 |
@@TOTAL_ERRORS | 磁碟讀寫錯誤總數 |
環境與設定
| 變數 | 說明 |
@@DATEFIRST | 週首日設定(1=星期一,7=星期日),受 SET DATEFIRST 影響 |
@@LANGID | 目前語言 ID |
@@LANGUAGE | 目前語言名稱 |
@@LOCK_TIMEOUT | 目前工作階段鎖等待逾時(毫秒,-1=無限等待) |
@@MAX_PRECISION | decimal/numeric 最大精確度(38) |
@@NESTLEVEL | 目前預存程序巢狀層級(初始 0) |
@@OPTIONS | 目前 SET 選項位元遮罩 |
@@TEXTSIZE | text/image 最大回傳長度(位元組),受 SET TEXTSIZE 影響 |
@@TIMETICKS | 每個時鐘滴答的微秒數 |
資料庫內部
| 變數 | 說明 |
@@DBTS | 目前資料庫時間戳記值(timestamp 型別保證唯一) |
@@PROCID | 目前預存程序物件 ID |
@@CURSOR_ROWS | 開啟游標中未讀取的合格資料列數 |
實務應用範例
1. 捕捉錯誤並記錄
BEGIN TRY
-- 高風險操作
UPDATE Accounts SET Balance = Balance - 100 WHERE ID = 1;
END TRY
BEGIN CATCH
INSERT INTO ErrorLog (ErrorNumber, ErrorMessage, ErrorTime)
VALUES (@@ERROR, ERROR_MESSAGE(), GETDATE());
END CATCH;
2. 取得剛插入記錄的 ID(單一資料表、無觸發器場景)
INSERT INTO Orders (CustomerID, OrderDate) VALUES ('ALFKI', GETDATE());
DECLARE @NewOrderID INT = @@IDENTITY;
-- 建議改用 SCOPE_IDENTITY() 避免觸發器干擾
3. 監控伺服器負載
SELECT
@@CONNECTIONS AS TotalConnections,
@@CPU_BUSY / 1000.0 AS CPU_Busy_Sec,
@@IO_BUSY / 1000.0 AS IO_Busy_Sec,
@@IDLE / 1000.0 AS Idle_Sec;
重要提醒
- @@IDENTITY 陷阱: 觸發器插入其他表也會改變其值,請改用
SCOPE_IDENTITY() 或 IDENT_CURRENT('table')
- @@ROWCOUNT 易失性: 任何陳述式(含
IF、PRINT)都會重置,必須緊接在目標陳述式後捕捉
- 累計計數器:
@@CPU_BUSY 等為啟動以來累計,需定期取樣計算速率才有意義
- 版本差異: 新版本 (2005+) 新增許多動態管理檢視 (DMV) 取代部分全域變數功能
善用全域變數能在除錯、監控、審計等場景事半功倍,是 DBA 與開發人員的必備工具箱。