从当前日期开始两个月之前创建的数据库中删除表

问题描述

我需要在我的数据库删除多个表,这些表距当前时间已超过两个月。

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

  • 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订单,因为要删除第一个参考表。 注意:创建表时应添加引用,然后查询才能正常工作。