根据修改日期自动删除表

时间:2015-05-06 10:02:28

标签: sql sql-drop

是否有办法根据修改日期每周或每月自动删除表格?经过对该网站的一些研究后,我发现了一个脚本并将其修改为以下内容。

select 
    'drop table Update_Backups.[' + s.name +'].[' + t.name +']' , t.modify_date
from 
    Update_Backups.sys.tables t
    inner join
    Update_Backups.sys.schemas s
    on
    s.schema_id = t.schema_id
where 
    modify_date < DATEADD(year,-01, GETDATE())

不幸的是它仍然有一个手动元素,因为我必须复制结果并运行它们。我希望这是完全自动化的,但我的技能不能达到那么远。

2 个答案:

答案 0 :(得分:1)

我认为游标上没有任何真正的优势,因为主要成本是执行语句,而不是构建它,但是你可以使用SQL Server的XML扩展组合你的语句,然后使用{ {1}}执行它们:

sp_executesql

N.B。我假设您正在使用基于目录视图DECLARE @SQL NVARCHAR(MAX) = (SELECT 'DROP TABLE Update_Backups.' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(OBJECT_NAME(t.object_id)) + '; ' FROM sys.tables t WHERE t.modify_date < DATEADD(year,-01, GETDATE()) FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'); PRINT @SQL -- FOR DEBUGGING YOU CAN CHECK THE STATEMENT ABOUT TO BE EXECUTED EXECUTE sp_executesql @SQL;

的SQL Server

修改

更新了SQL Server 2005的语法:

sys.tables

答案 1 :(得分:0)

您可以在值

上尝试光标
DECLARE @table VARCHAR(100),@sql VARCHAR(MAX)

DECLARE CURSOR_TB CURSOR FOR            
SELECT  DISTINCT t.name
FROM    Update_Backups.sys.tables t
JOIN    Update_Backups.sys.schemas s
ON      s.schema_id = t.schema_id
WHERE   modify_date < DATEADD(year,-01, GETDATE())

OPEN CURSOR_TB

    FETCH NEXT FROM CURSOR_TB INTO @table
    WHILE @@FETCH_STATUS=0
    BEGIN 

        IF OBJECT_ID(@table) is not null
        BEGIN
            SET @sql = 'DROP TABLE ' + @table
            EXEC (@sql)

        END
        FETCH NEXT FROM CURSOR_TB INTO @table
    END

    CLOSE CURSOR_TB
    DEALLOCATE CURSOR_TB