删除数据库中自当前日期起两个月以上创建的表



我需要在数据库中删除多个表,这些表是在当前时间后两个多月创建的。

我的数据库有以下示例表:

  • 表_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顺序,因为要删除第一个引用表。注意:创建表时应该添加引用,这样查询才能正常工作。

最新更新