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

Cra*_*rze 86 sql-server

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

Arn*_*shn 109

#table 指的是本地(仅对创建它的用户可见)临时表.

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

@variableName 是指一个变量,它可以根据其类型保存值.

干杯

  • 你对#table的定义并不完全正确.它不仅限于用户,而是连接.如果用户有多个连接,则只有首先创建#table的连接才能看到它. (28认同)

Adr*_*der 25

看一下

  • 我意识到这是在很久以前,但由于这是一个仅限链接的答案(并且第一个链接已经死了),是否可以使用每个链接的主要内容进行更新? (4认同)

小智 7

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

@table是一个表变量.

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

  • 如果表变量的大小太大而无法保存在内存中,那么表变量也将存在于tempDB数据库中. (4认同)

Mar*_*kus 7

CREATE TABLE #t
Run Code Online (Sandbox Code Playgroud)

创建一个仅在该 CONNECTION 上和期间可见的表,创建另一个连接的同一用户将无法从另一个连接看到表 #t。

CREATE TABLE ##t
Run Code Online (Sandbox Code Playgroud)

创建一个对其他连接可见的临时表。但是当创建连接结束时,该表将被删除。

  • 不,这是到同一个数据库的连接,但几乎可以肯定不是同一个连接。 (2认同)

Aar*_*and 6

我会关注#table和@table之间的区别.## table是一个全局临时表,对于使用SQL Server超过10年的记录,我还没有遇到过有效的用例.我确信有些存在,但对象的性质使它高度无法使用恕我直言.

@marc_s对@whiner的响应是绝对正确的:表变量总是存在于内存中是一种流行的神话.实际上,表变量转到磁盘并像临时表一样运行是很常见的.

无论如何,我建议按照@Astander指出的链接阅读这些差异.大多数差异都涉及对@table变量不能做的限制.

  • 我不想在我的数据库上授予审核员DROP权限.我也不想在他完成后回来整理.使用临时表,他可以随心所欲地运行查询,我知道当他完成时,他不会在数据库中留下足迹. (3认同)