使用系統函數 DB_NAME() 即可直接取得目前連接的資料庫名稱,無需查詢系統表:
SELECT DB_NAME() AS CurrentDatabase;
-- 或指定 database_id
SELECT DB_NAME(5) AS DatabaseName;
原文提到的 sp_who @@SPID 雖可行但屬過度設計,DB_NAME() 為標準、高效做法。
GO 為 SSMS/工具的批次分隔符,非 T-SQL 陳述式。每個批次有獨立的區域變數作用域,區域變數 (@var) 無法跨批次存活。解決方案有三種:
-- 批次 1:寫入
DECLARE @val INT = 42;
SET CONTEXT_INFO @val; -- 需轉為 binary(128)
GO
-- 批次 2:讀取
DECLARE @val INT;
SELECT @val = CAST(CONTEXT_INFO() AS INT);
SELECT @val; -- 輸出 42
-- 批次 1:建立並寫入
CREATE TABLE ##SessionVars (VarName NVARCHAR(128), VarValue SQL_VARIANT);
INSERT INTO ##SessionVars VALUES ('LoopCounter', 0);
GO
-- 批次 2:讀取/更新
UPDATE ##SessionVars SET VarValue = VarValue + 1 WHERE VarName = 'LoopCounter';
SELECT VarValue FROM ##SessionVars WHERE VarName = 'LoopCounter';
GO
將需跨批次的狀態封裝在資料表型別變數中,搭配預存程序執行,避免動態 SQL 與 GO 分隔。
WHILE 迴圈在單一批次內完成,是最乾淨的解法。##Global Temp Table 較直觀,但需注意命名衝突與清理機制。sp_who、sysprocesses 等非文件化系統物件解決業務邏輯問題。