有什么区别:
CREATE TABLE #temp ( [ID] INT)
INSERT INTO #temp
SELECT ...
和
DECLARE @temp TABLE ( [ID] INT)
INSERT @temp
SELECT ...
在SQL Server 2008中?
答案 0 :(得分:12)
临时表就像大多数特征中的普通表一样,除了它们进入TempDB而不是当前的数据库,并且它们在有限的范围之后消失(取决于它们是基于会话还是全局临时表。但是对数据的所有更改都是如此)临时表被记录到事务日志中,其中包含所有性能影响。otoh,您还可以向普通表中添加尽可能多的索引或视图,触发器或其他任何您想要的临时表。
表变量是一种快捷的内存表(它们也使用临时数据库)。不记录对它们的更改(这可以提高性能)。但是你只能得到一个索引,(因为索引不能在初始声明语句之后创建,你可以在表变量上创建的唯一索引是可以包含在初始表变量声明中的索引......
Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20))
由于这些特性,临时表是大表((宽行和多行)和/或在其生命周期中将经历多个访问模式的更好选择,而表变量在您需要时非常好窄表(仅键表,或只有一个数据列的键),它将始终被该索引键访问...
答案 1 :(得分:5)
这是对不同临时表的非常好的参考
答案 2 :(得分:1)
有关详细信息,请参阅this topic。
答案 3 :(得分:1)
表变量具有明确定义的范围。它们将在批处理结束时自动清除(即当前批处理语句),其中临时表对当前会话和嵌套存储过程可见。全局临时表将对所有会话可见。
表变量是使用Declare语句创建的。我们不能使用语句
创建表变量select * into @tableVariableName
但我们可以使用Create table语句和语句
创建临时表select * into #tempTableName
在SQL Server 2008之后,我们可以将表变量作为参数传递给存储过程。但是我们不能将临时表作为参数传递给存储过程。
我们可以在UDF(用户定义函数)中使用表变量,但我们不能在UDF中使用临时表。