【问题标题】:Stored Procedure Using Global Temporary Tables due to dynamic SQL由于动态 SQL,使用全局临时表的存储过程
【发布时间】:2016-04-20 18:45:24
【问题描述】:

目前我们有一个查询可以预测直接借记产品的收入。此查询使用永久表而不是临时表,因为查询使用动态 SQL,并且在动态 SQL 执行范围之外无法看到临时表。

我想要做的是使用全局临时表将它们放入存储过程中,以解决临时表超出范围的问题。我的问题是,如果它们永远不会并行运行,并且只有在存储过程像普通临时表一样运行后才会按顺序删除这些全局临时表?还是因为它们是全局的,所以它们会留在 tempdb 中?

另外请注意,我已经研究过 insert into table 方法,但遗憾的是,根据我下面的评论,我们使用大约 1000 个表来创建最终输出。

【问题讨论】:

  • 全局临时表有替代方案,比如使用insert . . . exec。您可能需要考虑其他解决方案。
  • 您好,我无法这样做,这会很复杂。查询本身会为一年中的每个月生成一个表,其中包含 12 年的先前收入。然后我们有 7 个不同的产品线,所以 7 *12 *12 所以很多小桌子。可悲的是,这是我继承的东西,而不是我自己创造的。
  • 我在某处读到过(不记得了):如果您创建一个全局临时表,则该表仅可用于其他会话,直到您的连接处于活动状态。如果您断开连接并且没有人正在从该表读取数据,则该表将丢失。这意味着如果您断开连接,任何正在读取表格的人都将成功完成他的操作,并且在所有其他会话没有对表格做任何事情之后表格将立即下降。我已经测试过了,这是真的。

标签: sql sql-server-2008 stored-procedures dynamic-sql global-temp-tables


【解决方案1】:

这详细说明了 Flicker 的评论。 documentation 是:

会话时会自动删除全局临时表 创建表结束并且所有其他任务已停止 引用它们。任务和表之间的关联是 仅在单个 Transact-SQL 语句的生命周期内维护。这 意味着全局临时表在完成时被删除 最后一个主动引用的 Transact-SQL 语句 创建会话结束时的表。

因此,这些似乎可以满足您的需求。

我不喜欢为此目的使用全局临时表。但它们似乎确实满足您的需求。好吧,当存储过程完成时,它们不会被删除,只是在会话结束时。您可以在定义表时使用动态 SQL 来强制执行此操作。

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 2013-09-01
    • 2018-10-22
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    相关资源
    最近更新 更多