临时表,表变量,在SQL Server 2008中的存储过程中使用的全局临时表之间的区别

时间:2014-08-05 22:48:46

标签: sql sql-server stored-procedures

我是SQL Server存储过程编码的新手。我难以在临时表,表变量,全局临时表之间进行决定,以用于在我的存储过程中存储数据。

我的情况是我需要在表中本地存储数据,以便在从各种SQL Server检索数据时计算值。常识告诉我使用临时表,但为什么我不能使用表变量或全局临时表?

任何见解都会有所帮助。

3 个答案:

答案 0 :(得分:0)

规则非常多,选择一个表变量作为默认值。然后在以下情况下重新评估情况:

如果要使用事务回滚 如果要将表的结果集从一个存储过程传递到另一个存储过程 如果您希望查询优化器能够计算出如何最好地运行复杂查询 如果您对动态SQL非常聪明,则需要一个临时表。

因此,表变量应该是您的首选。对于小型结果集和日常类型的数据操作,它们比临时表更快,更灵活,服务器在您完成后清理它们。 与temp表不同,temp变量不会在tempdb中持久存在,它会在SP或函数后立即自动清除。 Temp变量只能有1个索引,即primary,TT可以有更多的索引。对于少量数据使用临时变量,对TT使用反之亦然。变量中没有数据记录和数据回滚,但TT可用。使用变量比TT更少的SP重新编译。

全局临时表就像临时表一样,只要它们对所有会话都可见,因为创建会话有效。希望这可以让您了解您的方案可以采用哪种方式。

答案 1 :(得分:0)

表变量在功能上几乎与临时表相同 - 实际上,SQL服务器实际上至少在某些时候实际将temp变量实现为临时表。在你可以用它们做什么的限制方面存在一些功能上的差异,这使得在某些情况下比另一个更方便,插入exec的结果是常见的,因为使用create index来创建辅助键。

不保证temp var写入tempdb。事实上,Microsoft文档似乎暗示它不会写入tempdb,因此从理论上讲,temp vars可以预期更高性能或至少不会比临时表更慢。

全局临时表是可以在多个数据库连接上共享的临时表。与临时变量和临时表相比,这些相对较少。

ADDED

我们已在一些文章article#1article#2article#3Stack Overflow

中详细讨论了这些差异

ADDED

从这个答案的一些评论。我以前读过这些文章,是的,据我所知,表格vars总是通过tempdb实现。由于微软可能会在未来甚至2014年版本中更改实施(因为这些文章早于2014年)。这就是为什么我在理论上使用#34;等对冲词的原因。我引用的Stack Overflow文章简要提到了这一点。但附加文章的参考文献也相当不错。

我试图解释它们基本相同。您可以根据使用方式进行选择。如果任何一个都可以平等使用,你可能更喜欢临时变量,因为MS可以选择在未来提高效率。虽然看起来像是一个非常多的转储新手问题。

答案 2 :(得分:0)

临时表的作用域为会话

  Create TABLE #person        ----Statement 1
    ( 
    firstname varchar(100),
    lastname varchar(100)
    );
    INSERT #person   -----Statement 2
    SELECT TOP(250) p.firstname, p.lastname
    FROM person.person p;

    SELECT count(*) FROM #person; -----Statement 3

无论每个语句是单独运行还是成批运行,#person都会被填充

表变量的作用域为批处理

DECLARE @person TABLE        ----Statement 1
( 
firstname varchar(100),
lastname varchar(100)
)
INSERT @person   -----Statement 2
SELECT TOP(250) p.firstname, p.lastname
FROM person.person p

SELECT count(*) FROM @person  ----Statement 3

除非所有三个语句都以批处理方式运行,否则返回错误消息

Must declare the table variable "@person".

示例:-如果在语句1或语句1或语句1和语句2后跟语句3的批处理中运行语句2,则会出现上述错误。