【问题标题】:How to Drop N days old temp / temporary tables in SQL Server如何在 SQL Server 中删除 N 天前的临时/临时表
【发布时间】:2022-01-04 19:41:11
【问题描述】:

我们有 100 个 proc 正在创建临时表并且删除它们。许多构建都在生产中。我们希望 SQL 查询在 N (=2) 天后删除这些并安排它。有没有办法做到这一点?下面是从旧临时表中迭代的示例代码,但如果我运行它,它就无法删除这些表。

USE tempdb;
DECLARE @SQL VARCHAR(MAX) 

set @SQL = 
(
    SELECT   STUFF(
    (
        SELECT ' DROP TABLE ' + cast(name as varchar(200))
        FROM tempdb.sys.tables where create_date < '2019-12-10 00:00:00.000'
        FOR XML PATH('')
    ),1, 1, '')
);

PRINT @SQL;

【问题讨论】:

  • 您的示例代码是否适用于固定日期?你可以添加类似DATEADD(d,-2,GETADATE()) 这样的东西来让它动态
  • 是的,兄弟!它的暗示。 :)
  • 编码时不要假设或暗示任何事情。
  • #temp 和 ##temp 表在 tempdb 中结束,但它们由 SQL Server 管理和处理。在 tempdb 中创建自己的表与创建临时表不同。不要那样做。
  • @Nick.McDermaid 我已经编辑了问题的正确性。它不适用于较旧的临时表。甚至“SA”用户也拒绝访问 tempdb。

标签: sql sql-server optimization temp-tables


【解决方案1】:

当连接关闭并回收时,引擎会删除临时表。

所以我们不需要删除#table ##table,因为它可以由引擎本身自动完成。但是,作为最佳实践,手动删除创建它的脚本中的表将有助于 Sql server 决定垃圾收集。

Deleting Global Temporary Tables (##tempTable) in SQL Server

请在下方查看最新版本的 SQL Server https://codingsight.com/introduction-to-temporary-tables-in-sql-server/

【讨论】:

    【解决方案2】:

    查询完成后,就再也不能访问了,所以不管表是 2 天还是 2 秒,都应该删除。

    如果某个查询正在使用该表,它将被锁定,您将无法删除它。

    一种简单的方法是重新启动 SQL 服务器,这会清除所有临时表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多