SQL Server 2005和临时表范围

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

我知道本地临时表的作用域只对存储过程或子存储过程的生命周期有效。 然而,在协调方面情况如何。 即如果我有一个存储过程,创build一个临时表,这是从两个不同的进程,但从相同的用户/连接string调用临时表,共享之间的两个调用该存储过程的临时表,或将是一种情况每次调用存储过程都会创build一个唯一的临时表实例。

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

本地临时表(以#开头)仅限于您的会话; 其他会话甚至来自同一个用户/连接string,都看不到它们。 生命周期的规则取决于是否在存储过程中创build本地临时表:

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

全局临时表(以##开头)在会话之间共享。 在以下情况下会被丢弃

  • 创build它们的会话结束
  • 而没有其他会议是指他们

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

select TABLE_NAME from tempdb.information_schema.tables 

如果您不确定它们是否存在,那么可以方便地删除临时表:

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

有关更多信息,请参阅此MSDN文章 。

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

以下脚本

 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 

或者由于表已经存在而导致错误。

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

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

你也可以考虑使用表variables。 他们有一个非常明确的范围,他们有时比临时表的同行更快。 表variables的唯一问题是它们不能被索引,所以有些性能可能会丢失,尽pipe它们的性质。 点击这里查看关于这个主题的更多信息。