问题描述
我需要在我的数据库中删除多个表,这些表距当前时间已超过两个月。
我的数据库有以下示例表:
- Table_A_20200101
- Table_B_20200212
- Table_C_20200305
- Table_Exp
- Table_XYZ
解决方法
似乎比表元数据更依赖表名中的字符串来确定何时创建表,但这很好:
CREATE TABLE #TablesToDrop
(
s sysname,n sysname,d AS (CONVERT(date,RIGHT(n,8)))
);
INSERT #TablesToDrop(s,n)
SELECT s.name,t.name
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON s.[schema_id] = t.[schema_id]
WHERE ISDATE(RIGHT(t.name,8)) = 1;
DECLARE @sql nvarchar(max) = N'';
SELECT @sql += N'
DROP TABLE ' + QUOTENAME(s) + N'.' + QUOTENAME(n) + N';'
FROM #TablesToDrop
WHERE d < DATEADD(MONTH,-2,GETDATE());
PRINT @sql;
-- EXEC sys.sp_executesql @sql;
请注意,这不会以任何可预测的或依赖的顺序生成DROP
列表,也不会处理外键或其他阻止表被删除的依赖等。
您可以尝试以下操作:
Declare @DropQuery varchar(max)
SELECT
@DropQuery = ISNULL(@DropQuery +' ','') + 'drop table ' + T.tableName
FROM
(
select name as tableName,create_date from sys.tables
where create_date < dateadd(m,getdate())
)T
order by create_date desc
Print @DropQuery
EXEC(@DropQuery)
添加了create_date订单,因为要删除第一个参考表。 注意:创建表时应添加引用,然后查询才能正常工作。