K-M*_*K-M 5 sql database sql-server stored-procedures
我想在SQL服务器中创建一个存储过程和作业,它将删除模式中超过一周的所有表.
我每天都创建备份,我希望通过安排一个作业来删除任何超过一周的备份(SQL表)来自动化该过程.
非常感谢您的帮助.
您可以使用sys.objects
SQL 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天内已修改的所有对象).
该页面可以在这里找到:
并且是查询数据库对象"元数据"的许多不同方法的绝佳资源.
当然,上面只是简单地"选择"需要删除的表名,并且实际上不会从数据库中删除(或删除)表.
要实现此目的,您需要一种机制来发出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
命令!