資料表變數(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
#temp),擁有完整統計資料與索引支援。tempdb 壓力。善用資料表變數可簡化暫存邏輯,但必須理解其限制與適用邊界,避免效能陷阱。