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

如果创建日期超过一周,请删除SQL表-MS SQL Server,sql,sql-server,database,stored-procedures,Sql,Sql Server,Database,Stored Procedures,我想在Ms SQL server中创建一个存储过程和作业,用于删除架构中超过一周的所有表 我每天都创建备份,我希望通过安排一个作业来删除任何早于一周的备份(SQL表),从而使备份过程自动化 非常感谢您的帮助。您可以使用此查询获取一周以上的表列表: SELECT [name] ,create_date FROM sys.tables WHERE DATEDIFF(day, create_date, getdate()) > 7 因此,在SP

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

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


非常感谢您的帮助。

您可以使用此查询获取一周以上的表列表:

SELECT
        [name]
       ,create_date
FROM
        sys.tables
WHERE   DATEDIFF(day, create_date, getdate()) > 7

因此,在SP中,您可以编写一个SP来循环查询返回的表并删除它们。您必须考虑到,如果表有外键,则删除它们的顺序很重要,因此,如果这是您的情况,则可能需要一些技巧。

您可以在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 TABLE
命令。不幸的是,
DROP TABLE
命令不会接受参数值的表名(即,您不能
DROP TABLE@tablename
),但您可以构建完整t-SQL语句的字符串/varchar并
执行它)

为了实现这一点,您可以使用To循环前面的
SELECT
语句的结果,在string/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
命令

请注意,我将针对sysObjects@Sparky-是的,说得好。如果是原始海报,则此附加子句([和查询的xtype='U')将确保在查询中只检索用户表(即您自己创建的表),而不是潜在地删除“系统”表(即SQL Server本身添加的表)