Sql 使用表名删除超过12个月的表

Sql 使用表名删除超过12个月的表,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我希望能够删除超过12个月的表。这些表的名称中有日期、月份和年份。例如,表_A_2011_01的日期为2011年1月 我想做的是删除那些日期部分超过12个月的表。如果今天的日期是2011年9月15日,我想删除所有早于2010年9月15日的表。此查询将填充一个临时表,其中只有那些表名末尾是日期的表: SELECT SCHEMA_NAME(T.schema_id) + '.' + T.name TableName, REPLACE((RIGHT(T.name, 7) + '_01'), '_',

我希望能够删除超过12个月的表。这些表的名称中有日期、月份和年份。例如,表_A_2011_01的日期为2011年1月


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

此查询将填充一个临时表,其中只有那些表名末尾是日期的表:

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();
要进行清理,请同时删除临时表:

DROP TABLE #M;

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

    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

“恶心”的回答更好。当我开始写这篇文章时,他的文章没有发表。
    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
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;