2015-05-06 85 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