【问题标题】:Temporary Table Scope?临时表范围?
【发布时间】:2011-03-20 21:30:24
【问题描述】:

我在我的存储过程中使用临时表 #tempTable - 我用它来运行我的 ASP.net 报告(报告服务)

我正在做类似的事情

例如。代码

SELECT * INTO #tempTable FROM Contacts WHERE ContactID < 10

然后我使用类似的东西

SELECT o.* FROM #tempTable t INNER JOIN Orders o ON t.ContactID =o.ContactID

将值返回到我的报告,也就是存储过程的结果

我没有摆脱我的#tempTable

即我没有

DROP TABLE #tempTable

我已经读到临时表的范围仅适用于存储过程 - 执行上述操作也是必要的 - 如果我不执行上述操作,我将来会遇到什么问题

【问题讨论】:

  • @Tom :这可能是一个简化的例子。有时需要它们。

标签: sql sql-server-2005 tsql stored-procedures


【解决方案1】:

首先,一旦过程完成,在过程中创建的本地临时表就会被删除。来自BOL on Create Table

在存储过程中创建的本地临时表会在存储过程完成后自动删除。该表可以被创建该表的存储过程执行的任何嵌套存储过程引用。调用创建该表的存储过程的进程无法引用该表。

如果您的数据访问代码正确打开连接、调用存储过程然后关闭连接,则在过程中创建的临时表被有效销毁。

我说“有效”是为了提出另一点。我不建议在程序结束时删除临时表,尽管我会在创建临时表之前添加一个检查,如果存在则删除它(例如if object_id('tempdb..#Foo') is not null)。反对在最后删除临时表的论点是,通过调用 Drop 语句,您正在迫使 SQL Server 在等待过程结束时消耗资源来销毁该表。相反,如果您让它超出范围,您的过程会立即结束,并且您让 SQL Server 在自己选择的时间销毁表。

【讨论】:

    【解决方案2】:

    #Temp 表的范围仅限于您的会话和批次的生命周期,这意味着没有其他人可以看到您的临时表和 anyone else can create their own #Temp table with the same name。会话或批处理结束后,SQL Server 将清理临时表。

    另一方面,##Temp 表的行为类似于普通表。大家可以看到,同名的##Temp表不能超过1个。 SQL Server 将在服务器重新启动时清理这些 ##Temp 表。

    【讨论】:

    • 这并不完全准确。临时表不限于批次的范围——无论批次如何,它们都会在整个会话中存活。也就是说,你可以创建一个临时表,使用GO,临时表和它的数据仍然存在。
    • 我遇到了这样一种情况,即在 .NET SqlCommand 中创建的临时表将不会持续到第二个 SqlCommand,即使它们在同一个打开的连接上运行。
    【解决方案3】:

    明确删除您创建的每个临时表被认为是一种良好的编码习惯。如果您通过 SQL Server Management Studio/Query Analyzer 执行脚本,则临时表会一直保留,直到您明确删除它们或关闭会话。

    【讨论】:

    • 但是如果我通过 ASP.net 应用程序调用它们呢?
    • 在存储过程中创建的本地临时表会在存储过程完成时自动删除。但是,我倾向于在不再需要它们时立即丢弃它们。我想这在复杂的长时间运行的存储过程中更为重要。
    【解决方案4】:

    一般来说,不删除临时表可能不会有问题。在您的情况下,本地临时表具有会话范围或 SP 范围。当会话关闭或 SP 完成时,它会自动丢弃。

    但是,定期遵循这种做法确实会增加出现问题的风险。例如,如果您不使用 SP,而是从 ASP .net 提交您的 SELECT 语句并保持 SQL Server 连接打开,则临时表将继续存在。继续使用连接和其他临时表将导致 tempdb 随时间增长。

    我也支持其他有关在这种情况下使用临时表的 cmets。如果您创建一个没有临时表的解决方案,您可能会获得更快的报告并避免使用 DROP temp table 命令。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2016-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多