【问题标题】:Delete tables older than 12 months using table name使用表名删除超过 12 个月的表
【发布时间】:2011-09-15 11:55:37
【问题描述】:

我希望能够删除超过 12 个月的表。这些表的名称中有日期(月和年)。例如TABLE_A_2011_01 的日期为January 2011

我想要做的是删除那些日期部分超过 12 个月的表。如果今天的日期是September 15, 2011,我想删除所有早于September 15, 2010 的表。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:
    DECLARE @sql NVARCHAR(MAX) = N'';
    
    ;WITH p(o,d) AS
    (
        SELECT QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name),
            d = RIGHT(REPLACE(name, '_', ''), 6) + '01'
          FROM sys.tables 
          WHERE ISDATE(RIGHT(REPLACE(name, '_', ''), 6) + '01') = 1 
    )
    SELECT @sql += 'DROP TABLE ' + o + ';' FROM p
        WHERE d < CONVERT(CHAR(8), DATEADD(MONTH, -12, CURRENT_TIMESTAMP), 112);
    
    PRINT @sql;
    --EXEC sp_executesql @sql;
    

    【讨论】:

      【解决方案2】:

      此查询将填充一个临时表,其中仅包含表名结尾为日期的临时表:

      SELECT SCHEMA_NAME(T.schema_id) + '.' + T.name TableName,
        REPLACE((RIGHT(T.name, 7) + '_01'), '_', '-') TableDate
      INTO #M
      FROM sys.tables T
      WHERE ISDATE(REPLACE((RIGHT(T.name, 7) + '_01'), '_', '-')) = 1;
      

      下一部分是删除所有仍为“当前”的表 - 即延长日期在您的 12 个月窗口内:

      DELETE FROM #M
      WHERE DATEADD(MONTH, -12, TableDate) < GETDATE();
      

      现在您只剩下#M 中的匹配表,因此您可以以任何您喜欢的方式循环,执行动态 SQL 以删除表:

      WHILE (EXISTS (SELECT * FROM #M)) BEGIN
        DECLARE @TableName VarChar(100) = (SELECT TOP 1 TableName FROM #M);
        DECLARE @SQL NVarChar(1000) = 'DROP TABLE ' + @TableName;
        EXEC (@SQL);
        DELETE FROM #M WHERE TableName = @TableName;
      END;
      

      为了清理,也删除临时表:

      DROP TABLE #M;
      

      【讨论】:

        【解决方案3】:

        如果日期是最后 7 个,那么这应该可以为您提供列表日期。我无法真正测试最后一个,因为我的表格都不符合该格式。这样做的问题是,如果任何表名不符合该格式,则选择失败。您将需要添加删除/删除语法,但希望这会给您一个列表。

            select name from sysobjects where xtype='u'
        
            select DATEDIFF(dd, CONVERT(datetime,REPLACE(SUBSTRING('TABLE_C_2010_08',LEN('TABLE_C_2010_08')-6, 7),'_','.') + '.01',101), GETDATE())
        
        
            select name 
            from sysobjects 
            where xtype='u'
            and DATEDIFF(dd, CONVERT(datetime,REPLACE(SUBSTRING(name,LEN(name)-6, 7),'_','.') + '.01',101), GETDATE()) > 0
        

        【讨论】:

        • Yuck 的回答更好。当我开始写这篇文章时,他没有发布。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多