【问题标题】:SQL Server tables: what is the difference between @, # and ##?SQL Server 表:@、# 和 ## 有什么区别?
【发布时间】:2010-02-08 05:13:24
【问题描述】:

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

【问题讨论】:

    标签: sql-server


    【解决方案1】:

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

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

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

    【讨论】:

    • 您对#table 的定义并不完全正确。它不限于用户,而是连接。如果用户有多个连接,则只有最初创建 #table 的连接才能看到它。
    • @DavinStuder 提供了重要的说明。对用户可见的表与仅在当前连接上可见的表之间的区别非常重要。
    • @DavinStuder 如何查看用户的多个连接?相同的连接字符串?
    【解决方案2】:

    【讨论】:

    • 我意识到这是很久以前的事了,但由于这是一个仅链接的答案(并且第一个链接已失效),是否可以使用每个链接的主要内容对其进行更新?
    【解决方案3】:

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

    @table 是一个表变量。

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

    【讨论】:

    • 如果表变量太大而无法保存在内存中,表变量也将存在于 tempDB 数据库中。
    【解决方案4】:

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

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

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

    【讨论】:

    • 我有 5 个单独的存储过程,它们执行计算的不同部分并输出单个结果。对于审计,我希望看到中间值,审计员也是如此。我调整了我的程序以将一些转储到## Temp 表中,以便我们都可以查看它们,但它们不会被保留(它们仅在审计期间需要)。您有一个有效的用例(恕我直言!)。
    • @Ryan 为什么当您可以使用 dbo.Table 时 ##Table 仍然有效?当您所做的只是避免自己键入 DROP 语句时,我认为这不是一个有效的用例。
    • 我不想授予审核员对我的数据库的 DROP 权限。我也不想等他做完再回来收拾。使用临时表,他可以随心所欲地运行查询,我知道他完成后不会在数据库中留下足迹。
    【解决方案5】:
    CREATE TABLE #t
    

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

    CREATE TABLE ##t
    

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

    【讨论】:

    • SqlConnection.Open() with the same connection string is The same CONNECTION ?
    • 不,它是同一个数据库的连接,但几乎可以肯定不是同一个连接。
    【解决方案6】:

    如果您需要一个唯一的全局临时表,请使用唯一标识符前缀/后缀创建自己的临时表,如果 if object_id(.... 唯一的缺点是使用动态 sql,需要显式删除。

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 2010-11-21
      • 2016-04-16
      • 2011-01-14
      • 2010-09-06
      • 2013-08-03
      • 2010-09-12
      • 2015-06-06
      • 1970-01-01
      相关资源
      最近更新 更多