【问题标题】:DROP SQL Tables if created date is more than a week - MS SQL Server如果创建日期超过一周,则删除 SQL 表 - MS SQL Server
【发布时间】:2010-01-13 09:53:15
【问题描述】:

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

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

非常感谢您的帮助。

【问题讨论】:

    标签: sql sql-server database stored-procedures


    【解决方案1】:

    您可以在 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)该表。

    为此,您需要一种机制来发出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 命令!

    【讨论】:

    • 次要注意,我会针对 sysObjects 添加条件 [AND xtype='U' to the query]
    • @Sparky - 是的,好点。对于原始海报的好处,这个附加子句([AND xtype='U' to the query])将确保在查询中只检索用户表(即您自己创建的表),而不是可能删除“系统" 表(即 SQL Server 本身添加的东西)
    【解决方案2】:

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

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

    因此,在您的 SP 中,您可以编写一个 SP 来遍历从该查询返回的表并删除它们。您必须考虑到,如果表具有外键,则删除它们的顺序很重要,因此如果这是您的情况,这个想法可能需要一些调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2010-12-08
      • 1970-01-01
      相关资源
      最近更新 更多