【发布时间】:2010-01-13 09:53:15
【问题描述】:
我想在 Ms SQL 服务器中创建一个存储过程和作业,它将删除架构中超过一周的所有表。
我每天都创建备份,我想通过安排一个作业来删除任何超过一周的备份(SQL 表)来自动化这个过程。
非常感谢您的帮助。
【问题讨论】:
标签: sql sql-server database stored-procedures
我想在 Ms SQL 服务器中创建一个存储过程和作业,它将删除架构中超过一周的所有表。
我每天都创建备份,我想通过安排一个作业来删除任何超过一周的备份(SQL 表)来自动化这个过程。
非常感谢您的帮助。
【问题讨论】:
标签: sql sql-server database stored-procedures
您可以在 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 天内已修改的所有对象) .
该页面可以在这里找到:
对于查询数据库对象的“元数据”的许多不同方法来说,它是一个很好的资源。
当然,以上只是简单地“选择”需要删除的表名,并不会真正从数据库中删除(或 DROP)该表。
为此,您需要一种机制来发出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
请注意,在上面的示例中,我已经注释掉了 EXEC (@sql) 行。这是在@sql 变量中实际执行T-SQL 语句的行,由于它是一个破坏性命令,我只是将其注释掉并改用PRINT @sql 命令(下面的行)。按原样运行,查看您可能删除哪些表,如果您满意,请取消注释 EXEC (@sql) 命令并注释掉 PRINT @sql 命令!
【讨论】:
您可以使用此查询来获取超过一周的表的列表:
SELECT
[name]
,create_date
FROM
sys.tables
WHERE DATEDIFF(day, create_date, getdate()) > 7
因此,在您的 SP 中,您可以编写一个 SP 来遍历从该查询返回的表并删除它们。您必须考虑到,如果表具有外键,则删除它们的顺序很重要,因此如果这是您的情况,这个想法可能需要一些调整。
【讨论】: