我需要在数据库中删除多个表,这些表是在当前时间后两个多月创建的。
我的数据库有以下示例表:
- 表_A_20200101
- 表_B_20200212
- 表_C_20200305
- 表_Exp
- 表_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,-2,getdate())
)T
order by create_date desc
Print @DropQuery
EXEC(@DropQuery)
添加了create_date顺序,因为要删除第一个引用表。注意:创建表时应该添加引用,这样查询才能正常工作。