sql - 如果创建日期超过一周,则删除 SQL 表 - MS SQL Server

标签 sql sql-server database stored-procedures

我想在 Ms SQL Server 中创建一个存储过程和作业,以删除架构中超过一周的所有表。

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

非常感谢您的帮助。

最佳答案

您可以在 SQL Server 中使用 sys.objects 关键字来完成此操作。

查询应该是这样的:

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

上面的示例与 MSDN 页面上显示的第一个示例略有不同,该页面详细介绍了 sys.objects 关键字(A。返回上次修改的所有对象N 天).

可以在此处找到该页面:

sys.objects (Transact-SQL)

对于查询数据库对象“元数据”的许多不同方法来说,这是一个很好的资源。

当然,上面的代码只是简单地“选择”需要删除的表名,而不会实际从数据库中删除(或删除)该表。

为此,您需要一种机制来发出 DROP TABLE 命令。不幸的是,DROP TABLE 命令不接受参数值表名(即您不能执行 DROP TABLE @tablename),但您可以构建一个字符串/varchar一个完整的 T-SQL 语句并 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

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

关于sql - 如果创建日期超过一周,则删除 SQL 表 - MS SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2055746/

相关文章:

mysql - 获取 24 小时内回复对话第一条消息的用户

sql - 没有连接的 Oracle IN 子句对性能有何影响?

python - Django Rest Framework 多个数据库

java - Mysql&MSAccess : insert into table which have an incremented field

mysql - 如何合并 2 个表并按字母顺序获取输出

mysql - 复杂的 M :N relationship with MySQL tables

sql - 如何识别SQL Server的端口号

sql - “Relation” 与 RDBMS/SQL 中的 “relationship”?

sql - SP_WHO2有条件吗?

java - 发现批量更新失败的记录