SQL Server表:@,#和##有什么区别?

在SQL Server中,@ table,#table和## table有什么区别?

#table指的是一个本地(只对创build它的用户可见)临时表。

##table是指全局(对所有用户都可见)的临时表。

@variableName是指一个variables,它可以保存值取决于它的types。

干杯

看一下

  • 临时表与表variables及其对SQL Server性能的影响
  • SQL Server临时表和表variables之间的区别
  • 临时表和表variables:何时使用什么和为什么

我将重点讨论#table和@table之间的区别。 ## table是一个全局临时表,对于超过10年的使用SQL Server的logging,我还没有遇到一个有效的用例。 我确信有一些存在,但对象的性质使得它非常不可用恕我直言。

@marc_s对@whiner的回应是绝对正确的:表variables总是存在于内存中是一种stream行的说法。 实际上,一个表variables转到磁盘并像临时表一样操作是很常见的。

无论如何,我build议按照@Astander指出的链接来阅读这些差异。 大部分的差异都涉及到你无法用@tablevariables做的限制。

###表是临时数据库中表示的实际表。 这些表可以具有索引和统计信息,并且可以跨会话在sprocs中进行访问(在全局临时表的情况下,可以跨会话使用)。

@table是一个表variables。

更多信息: http : //www.sqlteam.com/article/temporary-tables

创build表#t

创build一个仅在该连接期间可见的表

创build另一个连接的同一个用户将无法看到表#t

创build表## t创build一个临时表,其他连接可见。 但是当创build连接结束时表被破坏

如果你需要一个唯一的全局临时表,使用Uniqueidentifier Prefix / Suffix来创build你自己的,并且如果一个if object_id(….唯一的缺点是使用dynamicsql并且需要显式的删除。

#table(local temporary table)#table(global temporary table)

#TABLE(本地临时表)

  1. 临时表仅可用于创build它的会话,并在会话closures时被删除。

  2. 本地临时表仅在当前会话中可见。

  3. 它在创build时接受单个散列值“#”作为前缀。 语法: (CREATE TABLE #t) 。 它们仅对创build它的连接可见,并在连接closures时被删除。

  4. 它以单个散列值“#”作为表名的前缀开始。

  5. 本地临时表仅用于创build连接。

  6. 您可以使用相同的名称创build一个本地临时表,但是使用不同的连接,并将其与各种随机值一起存储。

## TABLE(全球临时表)

  1. 临时表(全局)对所有会话均可用,但在创build临时表时全部closures,并且closures所有其他对其的引用。

  2. 全局临时表对所有会话均可见。 全局临时表会在创build表的会话结束并且所有其他任务停止引用时自动删除。

  3. 除了两个“##”值在创build时被用作前缀。 语法:( CREATE TABLE ##表名)。 它们对于SQL Server的所有连接都是可见的,并且只有在引用表的最后一个连接closures时(我们已经创build了全局临时表)才会被销毁。

  4. 它以单个散列值“##”作为表名称的前缀开始,并且其名称始终是唯一的。 名称后面没有随机数字。

  5. 您可以从SQL Server的所有连接访问全局临时表,直到引用连接打开。