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(本地临时表)
-
临时表仅可用于创build它的会话,并在会话closures时被删除。
-
本地临时表仅在当前会话中可见。
-
它在创build时接受单个散列值“#”作为前缀。 语法:
(CREATE TABLE #t)
。 它们仅对创build它的连接可见,并在连接closures时被删除。 -
它以单个散列值“#”作为表名的前缀开始。
-
本地临时表仅用于创build连接。
-
您可以使用相同的名称创build一个本地临时表,但是使用不同的连接,并将其与各种随机值一起存储。
## TABLE(全球临时表)
-
临时表(全局)对所有会话均可用,但在创build临时表时全部closures,并且closures所有其他对其的引用。
-
全局临时表对所有会话均可见。 全局临时表会在创build表的会话结束并且所有其他任务停止引用时自动删除。
-
除了两个“##”值在创build时被用作前缀。 语法:( CREATE TABLE ##表名)。 它们对于SQL Server的所有连接都是可见的,并且只有在引用表的最后一个连接closures时(我们已经创build了全局临时表)才会被销毁。
-
它以单个散列值“##”作为表名称的前缀开始,并且其名称始终是唯一的。 名称后面没有随机数字。
-
您可以从SQL Server的所有连接访问全局临时表,直到引用连接打开。