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

SQL Server 表變量完整指南:聲明、插入、查詢與實戰範例

     編輯:關於SqlServer

表變量(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;

表變量 vs 臨時表(#Temp)核心差異

維度表變量 @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);

最佳實踐清單

  • 行數 < 10,000 且無複雜 JOIN/排序 → 表變量。
  • 需索引、統計信息、大數據 JOIN → 臨時表。
  • 預存程序高併發場景 → 表變量減少重編譯、鎖競爭。
  • 動態 SQL 中傳遞表數據 → 表值參數(TVP,SQL 2008+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved