方式一
DECLARE @TempEmployees TABLE
- 表变量:使用DECLARE @TempEmployees TABLE声明的是表变量。
- 作用域:表变量的作用域仅限于声明它的批处理、存储过程或函数中。一旦批处理、存储过程或函数完成,表变量就会自动销毁。
- 性能:表变量存储在内存中,适用于小数据集。对于大数据集,表变量可能会自动存储到tempdb中。
事务控制:表变量不参与事务控制。回滚事务不会影响表变量的内容。 约束和索引:表变量可以定义主键和唯一约束,但不支持非唯一索引。
示例:
DECLARE @TempEmployees TABLE (
EmployeeID INT,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Salary DECIMAL(10, 2)
);
-- 插入数据
INSERT INTO @TempEmployees (EmployeeID, FirstName, LastName, Salary)
VALUES (1, 'John', 'Doe', 50000.00),
(2, 'Jane', 'Smith', 60000.00);
-- 查询数据
SELECT * FROM @TempEmployees;
方式二
CREATE TABLE #TempEmployees
- 临时表:使用CREATE TABLE #TempEmployees创建的是本地临时表。
- 作用域:本地临时表的作用域是创建它的会话(连接)。当会话结束时,临时表会自动销毁。如果在存储过程中创建临时表,则在存储过程结束时也会销毁。
- 性能:临时表存储在tempdb数据库中,适用于大数据集。与表变量相比,临时表在处理大量数据时性能更好。
- 事务控制:临时表参与事务控制。回滚事务会影响临时表的内容。
- 约束和索引:临时表可以定义任何类型的约束和索引,包括主键、唯一键、外键、非唯一索引等。
示例:
CREATE TABLE #TempEmployees (
EmployeeID INT,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Salary DECIMAL(10, 2)
);
-- 插入数据
INSERT INTO #TempEmployees (EmployeeID, FirstName, LastName, Salary)
VALUES (1, 'John', 'Doe', 50000.00),
(2, 'Jane', 'Smith', 60000.00);
-- 查询数据
SELECT * FROM #TempEmployees;
-- 删除临时表(通常不需要,因为会话结束后会自动删除)
DROP TABLE #TempEmployees;
总结
作用域:
表变量的作用域是当前批处理、存储过程或函数。
临时表的作用域是当前会话,或者存储过程的生命周期。
性能:
表变量适用于小数据集,存储在内存中。
临时表适用于大数据集,存储在tempdb中。
事务控制:
表变量不参与事务控制。
临时表参与事务控制。
约束和索引:
表变量支持主键和唯一约束,不支持非唯一索引。
临时表支持所有类型的约束和索引。
在选择使用表变量还是临时表时,应根据具体的需求和数据量来决定。对于较小的数据集和临时存储,可以使用表变量;对于需要复杂索引和约束或处理大数据集的场景,临时表更为合适。