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


Answers:


114

#table 引用本地(仅对创建它的用户可见)临时表。

##table 引用全局(对所有用户可见)临时表。

@variableName 是指可以根据其类型保存值的变量。


29
您对#table的定义并不完全正确。它不限于用户,而是连接。如果用户有多个连接,则仅对最初创建#table的连接可见。
戴文·斯图德

@DavinStuder提供了关键的说明。用户可见表与仅在当前连接上可见表之间的区别非常重要。
mirzmaster

@DavinStuder如何查看用户的多个连接?相同的连接字符串?
Kiquenet


7

###表是在临时数据库中表示实际表。这些表可以具有索引和统计信息,并且可以在会话中的所有存储过程中进行访问(对于全局临时表,它可以在会话中使用)。

@table是一个表变量。

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


4
如果表变量太大而无法容纳在内存中,则表变量也将驻留在tempDB数据库中。
marc_s

6

我将重点介绍#table和@table之间的区别。## table是一个全局临时表,对于使用SQL Server十多年来的记录,我还没有遇到有效的用例。我敢肯定有些东西存在,但是对象的性质使它高度不能使用恕我直言。

@marc_s对@whiner的响应是绝对正确的:普遍的说法是表变量始终存在于内存中。表变量进入磁盘并像临时表一样操作实际上是很常见的。

无论如何,我建议通过遵循@Astander指出的链接来阅读差异集。大部分差异涉及对@table变量无法执行的操作的限制。


我有5个独立的存储过程,它们执行计算的不同部分并输出单个结果。对于审核,我想查看中间值,审核员也是如此。我调整了程序,将其转储到##临时表中,以便我们都可以查看它们,但不保留它们(它们仅在审核期间需要)。有一个有效的用例(恕我直言!)。
RyanfaeScotland

@Ryan为什么本可以使用dbo.Table的## Table有效?当您所做的所有工作都避免键入DROP语句时,我认为这不是有效的用例。
亚伦·伯特兰

4
我不想授予审计员对数据库的DROP权限。我也不想在他完成后再回来整理一下。有了临时表,他可以随意运行查询,而且我知道完成后他不会在数据库中留下足迹。
RyanfaeScotland

4
CREATE TABLE #t

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

CREATE TABLE ##t

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


SqlConnection.Open()具有相同连接字符串连接 是否相同
Kiquenet '19

2
不,这是到同一数据库的连接,但是几乎可以肯定不是同一连接。
Markus

0

如果需要唯一的全局临时表,则使用Uniqueidentifier前缀/后缀创建自己的表,如果if_object(...),则删除后执行。唯一的缺点是使用Dynamic sql,并且需要显式删除。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.