2015-05-06 57 views
0

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

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()) 

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

+1

哪个DBMS?为了解决这个问题,你可能需要产品特定的功能。 – jarlh

+0

取而代之的是把这个查询转换成字符串并执行它 – techno

回答

1

我不认为有任何真正的好处,这在游标,因为主要的成本将要执行的语句,而不是构建它,但你可以使用SQL Server的XML扩展结合您的语句,然后使用sp_executesql执行它们:

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; 

NB我假设你正在使用基于使用目录视图sys.tables


编辑的SQL服务器

SQL Server 2005的更新语法:

DECLARE @SQL NVARCHAR(MAX); 

SET @SQL = (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; 
+0

非常感谢,你是对的,它是SQL。 Unfortunatley我试图运行此脚本时出现错误 - Msg 102,Level 15,State 1,Line 1 '('。''附近的语法不正确 Msg 156,Level 15,State 1,Line 7 关键字'FOR '。 Msg 137,Level 15,State 2,Line 9 必须声明标量变量“@SQL”。 – user3820135

+0

我已更新答案,我使用的语法是针对sql server 2008(及更高版本),我猜你正在使用SQL Server 2005,它不允许你声明一个变量,并在同一步骤中分配它。 – GarethD

+0

这样做完美,谢谢。将设置一项工作,每月运行一次。 – user3820135

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  
+0

非常感谢。看起来它很完美,但我现在不太清楚光标,所以现在阅读它。 Queick的问题,当在回滚中运行时,我得到'Commands completed'消息。有没有办法列出它运行的命令?谢谢 – user3820135

+0

例如,通常如果我运行更新,我会在回滚脚本中使用select语句来查看更改。我似乎无法这样做。谢谢 – user3820135

+0

我相信这是一个正确的答案,我非常感谢你的时间,不幸的是,我目前还不完全理解它的工作原理,因此将会进一步研究游标。 – user3820135