2010-01-13 82 views
4

我想在Ms SQL服務器中創建一個存儲過程和作業,它將刪除超過一週的模式中的所有表。DROP SQL表如果創建日期超過一個星期 - MS SQL Server

我每天都創建備份,我希望通過安排作業來刪除任何超過一週的備份(SQL表),從而使流程自動化。

您的幫助將不勝感激。

回答

6

您可以使用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 TABLE命令。不幸的是,DROP TABLE命令不會接受參數值表名(即不能執行DROP TABLE @tablename),但可以構建一個完整的T-SQL語句的字符串/ varchar和它的EXECUTE it)。

爲了達到這個目的,您可以使用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命令!

+0

非常感謝! – 2010-01-13 11:19:12

+0

小調,我會添加條件[AND xtype ='U'查詢]對sysObjects – Sparky 2010-01-13 12:30:36

+0

@Sparky - 是的,好點。爲了好處,如果原始海報,這個附加子句([AND xtype ='U'查詢])將確保只有用戶表(即你自己創建的)在查詢中被檢索到,而不是潛在地刪除「系統「表(即SQL Server自己添加的東西) – CraigTP 2010-01-13 13:03:29

0

您可以使用此查詢來獲取超過一個星期舊錶的列表:

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

所以,你可以寫一篇SP遍歷表,從該查詢返回並刪除它們。你必須考慮到,如果表中有外鍵,刪除它們的順序很重要,所以如果這是你的場景,這個想法可能需要一些tweeking。