首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

SQL Server 進階技巧:取得目前資料庫名稱與跨批次全域變數實作

     編輯:PHP 相關知識

問題一:如何在 T-SQL 中取得目前資料庫名稱

使用系統函數 DB_NAME() 即可直接取得目前連接的資料庫名稱,無需查詢系統表:

SELECT DB_NAME() AS CurrentDatabase;
-- 或指定 database_id
SELECT DB_NAME(5) AS DatabaseName;

原文提到的 sp_who @@SPID 雖可行但屬過度設計,DB_NAME() 為標準、高效做法。

問題二:跨 GO 批次共享變數值的解決方案

GO 為 SSMS/工具的批次分隔符,非 T-SQL 陳述式。每個批次有獨立的區域變數作用域,區域變數 (@var) 無法跨批次存活。解決方案有三種:

方案一:CONTEXT_INFO (Session 級緩衝區,128 bytes)

-- 批次 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

方案二:暫存表 (##Global Temp Table,跨 Session 可見)

-- 批次 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 2008+)

將需跨批次的狀態封裝在資料表型別變數中,搭配預存程序執行,避免動態 SQL 與 GO 分隔。

最佳實務建議

  1. 重構避免 GO: 將邏輯封裝在單一預存程序或使用 WHILE 迴圈在單一批次內完成,是最乾淨的解法。
  2. 若必須跨批次: 使用 ##Global Temp Table 較直觀,但需注意命名衝突與清理機制。
  3. CONTEXT_INFO 適合輕量級單一值傳遞,但容量限制 128 bytes 且型別轉換麻煩。
  4. 避免使用 sp_who、sysprocesses 等非文件化系統物件解決業務邏輯問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved