SQL Server 2005和临时表范围

时间:2009-05-21 10:56:04

标签: sql sql-server tsql

我已经阅读了临时表格和范围的主题,我所看到的所有答案似乎都没有谈到我的一个问题。

我理解本地临时表的作用域仅对存储过程或子存储过程的生命周期有效。然而,关于确定性的情况如何。即如果我有一个存储过程创建一个临时表,该临时表是从两个不同的进程调用但来自相同的用户/连接字符串,那么临时表是否会在对该一个存储过程的两次调用之间共享,或者是每次调用存储过程都会创建一个唯一的临时表实例。

我会假设临时表属于对存储过程的调用范围,但我想确定在我沿着这条路走下去之前。

4 个答案:

答案 0 :(得分:76)

本地临时表(以#开头)仅限于您的会话;其他会话,即使是来自同一用户/连接字符串,也看不到它们。生命周期的规则取决于是否在存储过程中创建了本地临时表:

  • 当过程结束时,将删除在存储过程中创建的本地临时表;其他存储过程或调用进程无法看到它们。
  • 会话结束时会删除其他本地临时表。

全局临时表(以##开头)在会话之间共享。他们在以下时间被删除:

  • 创建它们的会话结束
  • 并且没有其他会话指的是

此命令可以方便地查看存在哪些临时表:

select TABLE_NAME from tempdb.information_schema.tables 

如果您不确定它们是否存在,这对于删除临时表非常方便:

if object_id('tempdb..#SoTest') is not null drop table #SoTest

有关详细信息,请参阅此MSDN article

答案 1 :(得分:11)

临时表可以访问创建它的过程实例

以下脚本

Exec ('Select 1 as col Into #Temp Select * From #Temp')
Exec ('Select 2 as col Into #Temp Select * From #Temp')

返回

Col
1

Col
2

Col
1
2

或错误,因为该表已存在。

临时表也可由初始程序运行的任何“子”程序访问。

答案 2 :(得分:3)

以下文章可能有所帮助: “如何在存储过程之间共享数据” http://www.sommarskog.se/share_data.html

答案 3 :(得分:1)

您也可以考虑使用表变量。它们具有非常明确的范围,并且它们有时比它们的临时表格更快。表变量的唯一问题是它们不能被索引,因此尽管性质可能会丢失一些性能。 Check here了解有关该主题的更多信息。