Sql server SQL Server中的本地和全局临时表

Sql server SQL Server中的本地和全局临时表,sql-server,temp-tables,global-temp-tables,Sql Server,Temp Tables,Global Temp Tables,SQL Server中的本地临时表和全局临时表之间有什么区别?我发现这一解释非常清楚(完全是从中复制的): 有两种类型的临时表:本地表和全局表。本地临时表仅在与SQL Server实例的连接过程中对其创建者可见,与第一次创建或引用表时相同。在用户断开与SQL Server实例的连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都可见,并且在所有引用该表的用户断开与SQL Server实例的连接时将被删除 引用网上书籍: 本地临时表仅在当前会话中可见;全局临时表对所有会话都可见 临时

SQL Server中的本地临时表和全局临时表之间有什么区别?

我发现这一解释非常清楚(完全是从中复制的):

有两种类型的临时表:本地表和全局表。本地临时表仅在与SQL Server实例的连接过程中对其创建者可见,与第一次创建或引用表时相同。在用户断开与SQL Server实例的连接后,将删除本地临时表。全局临时表在创建后对任何用户和任何连接都可见,并且在所有引用该表的用户断开与SQL Server实例的连接时将被删除


引用网上书籍:

本地临时表仅在当前会话中可见;全局临时表对所有会话都可见

临时表超出范围时会自动删除,除非使用DROP TABLE显式删除:

  • 在存储过程中创建的本地临时表将在存储过程完成时自动删除。该表可以由创建该表的存储过程执行的任何嵌套存储过程引用。调用创建该表的存储过程的进程无法引用该表
  • 在当前会话结束时,将自动删除所有其他本地临时表
  • 当创建表的会话结束并且所有其他任务停止引用全局临时表时,全局临时表将自动删除。任务和表之间的关联仅在单个Transact-SQL语句的生命周期内保持。这意味着在创建会话结束时,在最后一条主动引用表的Transact-SQL语句完成时,将删除全局临时表
      • 表变量(
        DECLARE@t Table
        )仅对创建它的连接可见,并在批处理或存储过程结束时删除


      • 本地临时表
        创建表#t
        )仅对 创建它的连接,并在连接断开时删除 关闭

      • 全局临时表
        创建表##t
        )对每个人都可见,
        当所有引用它们的连接都已关闭时,它们将被删除

      • Tempdb永久表(
        使用Tempdb创建表t
        )对用户可见 重新启动服务器时,所有人和都将被删除

      1。)本地临时表仅在连接期间存在,或者如果在复合语句中定义,则在复合语句期间存在

      本地临时表仅可用于SQL Server会话或 创建表的连接(表示单个用户)。这些是 创建表的会话结束时自动删除 已经关闭了。本地临时表名以单个哈希开头 (“#”)符号

      本地临时表的作用域存在于当前会话的当前会话中 用户指的是当前查询窗口。如果你要关上电源 “查询”窗口或打开一个新的查询窗口,并将尝试查找上面的内容 创建临时表时,它将显示错误


      2.全局临时表将永久保留在数据库中,但行仅存在于给定连接中。当连接关闭时,全局临时表中的数据将消失。但是,当下次打开数据库时,表定义将保留在数据库中以供访问

      全局临时表可用于所有SQL Server会话或 连接(指所有用户)。这些可以由任何SQL创建 服务器连接用户,当所有 SQL Server连接已关闭。全局临时表 名称以双哈希(“##”)符号开头

      全局临时表对所有SQL Server连接都可见 而本地临时表仅对当前SQL Server可见 连接


      值得一提的是,还有:(目前仅由Azure SQL数据库支持)

      SQL Server的全局临时表(以##表名启动)存储在tempdb中,并在整个SQL Server实例的所有用户会话中共享。

      -- Session A creates a global temp table ##test in Azure SQL Database testdb1
      -- and adds 1 row
      CREATE TABLE ##test ( a int, b int);
      INSERT INTO ##test values (1,1);
      
      -- Session B connects to Azure SQL Database testdb1 
      -- and can access table ##test created by session A
      SELECT * FROM ##test
      ---Results
      1,1
      
      -- Session C connects to another database in Azure SQL Database testdb2 
      -- and wants to access ##test created in testdb1.
      -- This select fails due to the database scope for the global temp tables 
      SELECT * FROM ##test
      ---Results
      Msg 208, Level 16, State 0, Line 1
      Invalid object name '##test'
      
      Azure SQL数据库支持全局临时表,这些表也存储在tempdb中,作用域为数据库级别。这意味着在同一Azure SQL数据库中为所有用户的会话共享全局临时表来自其他数据库的用户会话无法访问全局临时表。

      -- Session A creates a global temp table ##test in Azure SQL Database testdb1
      -- and adds 1 row
      CREATE TABLE ##test ( a int, b int);
      INSERT INTO ##test values (1,1);
      
      -- Session B connects to Azure SQL Database testdb1 
      -- and can access table ##test created by session A
      SELECT * FROM ##test
      ---Results
      1,1
      
      -- Session C connects to another database in Azure SQL Database testdb2 
      -- and wants to access ##test created in testdb1.
      -- This select fails due to the database scope for the global temp tables 
      SELECT * FROM ##test
      ---Results
      Msg 208, Level 16, State 0, Line 1
      Invalid object name '##test'
      

      GLOBAL_TEMPORARY_TABLE_AUTODROP = { ON | OFF }
      
      适用于:Azure SQL数据库(功能在公共预览中)

      允许设置全局临时文件的自动放置功能 桌子。默认值为ON,这意味着全局临时 当任何会话都不使用表时,会自动删除这些表什么时候 设置为OFF时,需要显式删除全局临时表 使用DROP TABLE语句或将自动在 服务器重新启动。

      -- Session A creates a global temp table ##test in Azure SQL Database testdb1
      -- and adds 1 row
      CREATE TABLE ##test ( a int, b int);
      INSERT INTO ##test values (1,1);
      
      -- Session B connects to Azure SQL Database testdb1 
      -- and can access table ##test created by session A
      SELECT * FROM ##test
      ---Results
      1,1
      
      -- Session C connects to another database in Azure SQL Database testdb2 
      -- and wants to access ##test created in testdb1.
      -- This select fails due to the database scope for the global temp tables 
      SELECT * FROM ##test
      ---Results
      Msg 208, Level 16, State 0, Line 1
      Invalid object name '##test'
      
      对于Azure SQL数据库单个数据库和弹性池,可以在SQL数据库的各个用户数据库中设置此选项 服务器。 在SQL Server和Azure SQL数据库托管实例中,此选项在TempDB中设置,并且单个用户数据库的设置已更改 没有效果


      本地临时表:如果创建本地临时表,然后打开另一个连接并尝试查询,将出现以下错误

      临时表只能在创建它们的会话中访问

      全局临时表: 有时,您可能需要创建一个临时