表變量(TABLE 型別變量)是批次/預存程序內的輕量級臨時表,存儲於 tempdb,生命週期隨批次結束自動銷毀,無需手動 DROP,適合小數據集(<1萬行)的中轉運算。
-- 1. 聲明
DECLARE @t TABLE (
Col1 INT PRIMARY KEY,
Col2 NVARCHAR(50) NOT NULL,
Col3 DATETIME DEFAULT GETDATE()
);
-- 2. 插入:VALUES 或 SELECT
INSERT INTO @t (Col1, Col2) VALUES (1, N'測試');
INSERT INTO @t (Col1, Col2) SELECT Id, Name FROM SourceTable WHERE ...;
-- 3. 查詢
SELECT * FROM @t;
| 維度 | 表變量 @t | 臨時表 #t |
|---|---|---|
| 作用域 | 批次/程序內 | 會話級(全域 ##t 更廣) |
| 統計信息 | 無(固定 1 行估計) | 自動建立/更新 |
| 索引 | 僅聲明時定義 PK/UNIQUE | 運行時可動態 CREATE INDEX |
| 事務/回滾 | 不參與用戶事務 | 參與,可回滾 |
| 重編譯 | 不觸發 | 可能觸發 |
| 適用場景 | 小數據、高併發、簡單中轉 | 大數據、複雜查詢、需索引優化 |
DECLARE @Filtered TABLE (
EmpId INT,
EmpName NVARCHAR(20)
);
INSERT INTO @Filtered (EmpId, EmpName)
SELECT EmpId, EmpName
FROM dbo.Employees
WHERE EmpName LIKE N'李%';
SELECT * FROM @Filtered;
/* 結果
EmpId EmpName
101 李明
105 李華
*/
CREATE FUNCTION dbo.GetEmployeesByDept (@DeptId INT)
RETURNS TABLE
AS
RETURN (
SELECT EmpId, EmpName, Salary
FROM dbo.Employees
WHERE DeptId = @DeptId
);
-- 調用如同視圖
SELECT * FROM dbo.GetEmployeesByDept(3);