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

SQL Server 資料表變數完整指南:宣告限制、作用域與實務範例

     編輯:Oracle 資料庫基礎

資料表變數 vs 陣列:相似但有限制

資料表變數(TABLE 型別)可像陣列般暫存結果集,但限制較多:

  • 不支援巢狀資料表變數(無法在資料表變數中包含另一個資料表變數)。
  • 宣告後無法變更結構(ALTER TABLE 無效),所有屬性必須在 DECLARE 時完整定義。
  • INSERT ... EXEC 無法搭配資料表變數使用。
  • SELECT INTO 不能將資料插入資料表變數。
  • 系統預存程序(如 sp_depends)因物件名稱在執行時隨機產生於 tempdb,難以對資料表變數操作。

作用域:批次、存儲程序、函數

資料表變數的生命週期限於宣告所在的批次、存儲程序或函數執行期間。遇到 GO 批次分隔符即離開作用域,自動銷毀。

實務範例:存儲程序中使用資料表變數

CREATE PROCEDURE TestTableVariable AS
BEGIN
  DECLARE @TableId TABLE (
    table_id INT IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED,
    id       INT NOT NULL,
    name     SYSNAME NOT NULL DEFAULT 'UNKNOWN',
    type     CHAR(2) NOT NULL DEFAULT '9',
    crdate   DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
  );

  INSERT @TableId (id, name, type, crdate)
  SELECT id, 'test_' + name, type, crdate
  FROM tempdb..sysobjects;

  SELECT * FROM @TableId;
END
GO

EXEC TestTableVariable;
GO

適用場景與效能考量

  • 小量資料暫存(數百列內):資料表變數無統計資料,優化器假設 1 列,執行計畫穩定,重組成本低。
  • 大量資料或需索引/統計資料:改用暫存表(#temp),擁有完整統計資料與索引支援。
  • 避免在高併發長交易中使用,減少 tempdb 壓力。

善用資料表變數可簡化暫存邏輯,但必須理解其限制與適用邊界,避免效能陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved