我希望能够删除超过12个月的表格。表格的名称中包含日期(月份和年份)。例如,TABLE_A_2011_01
的日期为January 2011
。
我想要做的是删除那些日期部分超过12个月的表格。如果今天的日期为September 15, 2011
,我想删除所有早于September 15, 2010
的表格。
答案 0 :(得分:4)
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;
答案 1 :(得分: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;
答案 2 :(得分:0)
如果日期是最后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