代码之家  ›  专栏  ›  技术社区  ›  Dafydd Giddins

SQL Server 2005和临时表作用域

  •  46
  • Dafydd Giddins  · 技术社区  · 16 年前

    我知道本地临时表的作用域仅在存储过程或子存储过程的生存期内有效。然而,在一致性方面的情况如何。i、 e.如果我有一个存储过程,该存储过程创建了一个临时表,该临时表是从两个不同的进程调用的,但来自同一个用户/连接字符串,那么该临时表是在对该存储过程的两次调用之间共享,还是在每次调用该存储过程时都会创建一个唯一的临时表实例。

    4 回复  |  直到 16 年前
        1
  •  78
  •   Andomar    16 年前

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

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

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

    • 创建它们的会话将结束
    • 没有其他会议提到他们

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

    select TABLE_NAME from tempdb.information_schema.tables 
    

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

    看到这个了吗 MSDN article 了解更多信息。

        2
  •  11
  •   Martynnw    16 年前

    下面的脚本

    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
    

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

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

        3
  •  2
  •   Scott Arrington    16 年前

    您还可以考虑使用表变量。它们有一个定义良好的范围,有时比临时表的对应项更快。表变量的唯一问题是它们不能被索引,因此尽管它们的性质不同,一些性能可能会丢失。 Check here