SqlServer中临时表@和#的区别

方式一

DECLARE @TempEmployees TABLE
  1. 表变量:使用DECLARE @TempEmployees TABLE声明的是表变量。
  2. 作用域:表变量的作用域仅限于声明它的批处理、存储过程或函数中。一旦批处理、存储过程或函数完成,表变量就会自动销毁。
  3. 性能:表变量存储在内存中,适用于小数据集。对于大数据集,表变量可能会自动存储到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
  1. 临时表:使用CREATE TABLE #TempEmployees创建的是本地临时表。
  2. 作用域:本地临时表的作用域是创建它的会话(连接)。当会话结束时,临时表会自动销毁。如果在存储过程中创建临时表,则在存储过程结束时也会销毁。
  3. 性能:临时表存储在tempdb数据库中,适用于大数据集。与表变量相比,临时表在处理大量数据时性能更好。
  4. 事务控制:临时表参与事务控制。回滚事务会影响临时表的内容。
  5. 约束和索引:临时表可以定义任何类型的约束和索引,包括主键、唯一键、外键、非唯一索引等。

示例:

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中。

事务控制
表变量不参与事务控制。
临时表参与事务控制。

约束和索引
表变量支持主键和唯一约束,不支持非唯一索引。
临时表支持所有类型的约束和索引。
在选择使用表变量还是临时表时,应根据具体的需求和数据量来决定。对于较小的数据集和临时存储,可以使用表变量;对于需要复杂索引和约束或处理大数据集的场景,临时表更为合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coding唯手熟尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值