SQL Server 2005和临时表范围

Daf*_*ins 46 sql t-sql sql-server

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

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

我假设临时表属于对存储过程的调用范围,但我想确定在我走这条路径之前.

And*_*mar 76

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

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

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

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

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

select TABLE_NAME from tempdb.information_schema.tables 
Run Code Online (Sandbox Code Playgroud)

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

if object_id('tempdb..#SoTest') is not null drop table #SoTest
Run Code Online (Sandbox Code Playgroud)

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

  • 有人偷了你的雷声:) https://social.msdn.microsoft.com/Forums/sqlserver/en-US/522d302a-857f-4730-b49f-cca7fb236912/is-it-necessary-to-clean-up-drop-临时表,在存储,程序?论坛= TRANSACTSQL (4认同)

Mar*_*nnw 11

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

以下脚本

Exec ('Select 1 as col Into #Temp Select * From #Temp')
Exec ('Select 2 as col Into #Temp Select * From #Temp')
Run Code Online (Sandbox Code Playgroud)

返回

Col
1

Col
2
Run Code Online (Sandbox Code Playgroud)

Col
1
2
Run Code Online (Sandbox Code Playgroud)

或者因为表已经存在而出错.

临时表也可以由初始过程运行的任何"子"程序访问.

  • +1好点,Exec()启动内部范围.在exec()内创建的临时表对父进程不可见.父级的临时表对子级是可见的,但如果子级创建具有相同名称的临时表,则它将创建一个新表. (4认同)