DROP SQL表如果创建日期超过一周 - MS SQL Server

K-M*_*K-M 5 sql database sql-server stored-procedures

我想在SQL服务器中创建一个存储过程和作业,它将删除模式中超过一周的所有表.

我每天都创建备份,我希望通过安排一个作业来删除任何超过一周的备份(SQL表)来自动化该过程.

非常感谢您的帮助.

Cra*_*gTP 8

您可以使用sys.objectsSQL Server中的关键字来完成此操作.

查询将是这样的:

USE [Your_Database_Name];
GO
SELECT name AS object_name 
  ,SCHEMA_NAME(schema_id) AS schema_name
  ,type_desc
  ,create_date
  ,modify_date
FROM sys.objects
WHERE create_date > GETDATE() - [No_Of_Days_Old]
ORDER BY create_date;
GO
Run Code Online (Sandbox Code Playgroud)

上面的示例在MSDN页面上显示的第一个示例略有不同,该示例详细说明了sys.objects关键字(A.返回在过去N天内已修改的所有对象).

该页面可以在这里找到:

sys.objects(Transact-SQL)

并且是查询数据库对象"元数据"的许多不同方法的绝佳资源.

当然,上面只是简单地"选择"需要删除的表名,并且实际上不会从数据库中删除(或删除)表.

要实现此目的,您需要一种机制来发出DROP TABLE命令.不幸的是,该DROP TABLE命令不会接受参数值表名(即你不能这样做DROP TABLE @tablename),但你可以构建一个完整的T-SQL语句的字符串/ varchar和EXECUTE它).

为此,您可以使用CURSOR循环前面SELECT语句的结果,在字符串/ varchar中构建一个新的T-SQL命令,该命令将删除表名.下面是一个例子:

DECLARE @tname VARCHAR(100)
DECLARE @sql VARCHAR(max)

DECLARE db_cursor CURSOR FOR 
SELECT name AS tname
FROM sys.objects
WHERE create_date > GETDATE() - 7

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @tname  

WHILE @@FETCH_STATUS = 0  
BEGIN  
       SET @sql = 'DROP TABLE ' + @tname
       --EXEC (@sql)
       PRINT @sql

       FETCH NEXT FROM db_cursor INTO @tname  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的示例中,我已注释掉该行EXEC (@sql).这是在@sql变量中实际执行T-SQL语句的行,由于它是一个破坏性命令,我只是将其注释掉并使用PRINT @sql命令(下面的行).按原样运行,查看您可能删除的表格,当您满意时,取消注释EXEC (@sql)命令并注释掉PRINT @sql命令!