SQL 2008中的TEMPORARY TABLE和TABLE VARIABLE有什么区别?

时间:2009-10-20 21:05:40

标签: sql sql-server sql-server-2008 tsql temp-tables

有什么区别:

CREATE TABLE #temp ( [ID] INT)

INSERT INTO #temp
SELECT ...

DECLARE @temp TABLE ( [ID] INT)

INSERT @temp
SELECT ...

在SQL Server 2008中?

4 个答案:

答案 0 :(得分:12)

临时表就像大多数特征中的普通表一样,除了它们进入TempDB而不是当前的数据库,并且它们在有限的范围之后消失(取决于它们是基于会话还是全局临时表。但是对数据的所有更改都是如此)临时表被记录到事务日志中,其中包含所有性能影响。otoh,您还可以向普通表中添加尽可能多的索引或视图,触发器或其他任何您想要的临时表。

表变量是一种快捷的内存表(它们也使用临时数据库)。不记录对它们的更改(这可以提高性能)。但是你只能得到一个索引,(因为索引不能在初始声明语句之后创建,你可以在表变量上创建的唯一索引是可以包含在初始表变量声明中的索引......

   Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20)) 

由于这些特性,临时表是大表((宽行和多行)和/或在其生命周期中将经历多个访问模式的更好选择,而表变量在您需要时非常好窄表(仅键表,或只有一个数据列的键),它将始终被该索引键访问...

答案 1 :(得分:5)

这是对不同临时表的非常好的参考

Temp Tables vs Variables

答案 2 :(得分:1)

  1. 表变量没有日志
  2. 表变量只有本地范围(您不能从不同的过程访问相同的表变量)
  3. 临时表的程序无法预编译
  4. 有关详细信息,请参阅this topic

答案 3 :(得分:1)

  1. 表变量具有明确定义的范围。它们将在批处理结束时自动清除(即当前批处理语句),其中临时表对当前会话和嵌套存储过程可见。全局临时表将对所有会话可见。

  2. 表变量是使用Declare语句创建的。我们不能使用语句

    创建表变量
    select * into @tableVariableName
    

    但我们可以使用Create table语句和语句

    创建临时表
    select * into #tempTableName
    
  3. 在SQL Server 2008之后,我们可以将表变量作为参数传递给存储过程。但是我们不能将临时表作为参数传递给存储过程。

  4. 我们可以在UDF(用户定义函数)中使用表变量,但我们不能在UDF中使用临时表。