Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server表:@、#和##之间有什么区别?_Sql Server - Fatal编程技术网

Sql server SQL Server表:@、#和##之间有什么区别?

Sql server SQL Server表:@、#和##之间有什么区别?,sql-server,Sql Server,在SQL Server中,@table、#table和#table之间有什么区别?#table指的是本地(仅创建它的用户可见)临时表 ##表指的是全局(对所有用户可见)临时表 @variableName是指根据其类型可以保存值的变量。和#表是临时数据库中表示的实际表。这些表可以具有索引和统计信息,并且可以在会话中跨存储过程访问(对于全局临时表,它可以跨会话访问) @table是一个表变量 更多信息:请查看 我将重点讨论#table和@table之间的区别##表是一个全局临时表,在使用SQ

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

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

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

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

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

@table是一个表变量

更多信息:

请查看


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

@marc_s对@whiner的回应是绝对正确的:表变量总是存在于内存中是一个普遍的神话。实际上,表变量进入磁盘并像临时表一样运行是很常见的

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

CREATE TABLE #t
创建仅在该连接上和连接期间可见的表 创建另一个连接的同一用户将无法从另一个连接中查看表#t

CREATE TABLE ##t

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

如果需要唯一的全局临时表,请使用Uniqueidentifier前缀/后缀创建自己的临时表,如果存在if对象id,则删除执行后的临时表(..唯一的缺点是使用动态sql,需要显式删除。

如果表变量的大小太大而无法保存在内存中,它也将存在于tempDB数据库中。我有5个单独的存储过程,它们执行计算的不同部分并输出单个结果。对于审计,我希望看到中间值,我也希望看到中间值审核员。我调整了我的程序,将一些转储到###Temp表中,这样我们都可以查看它们,但它们不会被保留(它们只在审核期间需要)。您有一个有效的用例(IMHO!)@赖安,为什么当你可以使用DBO?表时,你的表是有效的?我不认为这是一个有效的用例,当你所做的一切都被保存在输入一个DROP语句中时。我不想给我的DB上的审核员丢掉权限。我也不想在他完成之后再回来整理。使用临时表,他可以经常运行查询。他喜欢,我知道当他完成后,他不会在数据库中留下任何痕迹。我意识到这是很久以前的事了,但因为这是一个链接唯一的答案(第一个链接已经死了),是否可以使用每个链接的主要内容进行更新?您对#表的定义并不完全正确。它不仅限于用户,还包括连接。如果用户有多个连接,它将仅对最初创建#表的连接可见。@DavinStuder提供了一个关键的澄清。The用户可见的表与仅在当前连接上可见的表之间的区别非常重要。@DavinStuder如何查看用户的多个连接?相同的连接字符串?
SqlConnection.Open()
使用相同的连接字符串是相同的连接吗?不,它是到相同数据库的连接,但几乎可以肯定不是相同的连接。