9

有什么区别:

CREATE TABLE #temp ( [ID] INT)

INSERT INTO #temp
SELECT ...

DECLARE @temp TABLE ( [ID] INT)

INSERT @temp
SELECT ...

在 SQL Server 2008 中?

4

4 回答 4

12

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

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

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

由于这些特性,临时表更适合大型表(宽且具有许多行)和/或在其生命周期中将经历不止一种访问模式,而当您需要非常窄的表时,表变量是最佳选择(仅键表或仅具有一个数据列的键),将始终由该索引键访问...

于 2009-10-20T21:17:05.997 回答
5

这是不同临时表的一个很好的参考

临时表与变量

于 2009-10-20T21:13:10.410 回答
1
  1. 表变量没有日志
  2. 表变量只有局部范围(您不能从不同的过程访问同一个表变量)
  3. 不能预编译带有临时表的过程

有关更多详细信息,请参阅此主题

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

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

    select * into @tableVariableName
    

    但是我们可以使用 Create table 语句以及语句来创建临时表

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

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

于 2013-03-28T16:02:17.623 回答