SQL Server Temp表与表变量

时间:2011-08-09 04:54:12

标签: sql-server temp-tables

我们客户的数据库管理员要求我们不在报告存储过程(#Table)中使用临时表,而是使用表变量。

表变量的效率是否低于临时表?

另外,如果我创建的表格为#table,而不是##table,那么一个#的表格就是会话表格,而不是##是全球性的,对吗?完成stored procedure后,您没有执行DROP TABLE #table ... #table是否仍然存在?如果它是基于会话的,那么我将再次访问它吗?

3 个答案:

答案 0 :(得分:2)

表变量可以导致比临时表更少的存储过程重新编译(请参阅KB #243586和KB #305977),并且 - 由于无法回滚 - 请不要打扰事务日志。

##table与全球临时表格相似。是的#table不存在,因为它只在给定的范围内,你永远不会在给定的范围内访问它。

修改

我还想指出使用CTE(公用表表达式),因为它也以某种方式用作临时表。 请查看此答案以获取详细信息:Which are more performant, CTE or temporary tables?

答案 1 :(得分:0)

我不是100%肯定你在问什么,因为你的标题提到了表变量,你被要求使用表变量,但是你的问题没有询问表变量......但是表变量被声明为:

DECLARE @Banana TABLE 
(
  Id INT,
  Name VARCHAR(20)
)

答案 2 :(得分:-1)

如果在SP中创建了本地临时表(#table),则在SP完成后将其删除。 BOL说:

临时表超出范围时会自动删除,  除非使用DROP TABLE显式删除:

  • 删除在存储过程中创建的本地临时表 存储过程完成后自动执行。表可以 由存储的任何嵌套存储过程引用 创建表的过程。该表不能被引用 调用创建表的存储过程的过程。

  • 所有其他本地临时表都会自动删除 本届会议结束。

  • 会话时会自动删除全局临时表 创建表结束,所有其他任务已停止 引用它们。任务和表之间的关联是 仅在单个Transact-SQL语句的生命周期内维护。这个 表示在完成时删除全局临时表 最后一个主动引用的Transact-SQL语句 创建会话结束时的表格。