我想在Ms SQL服務器中創建一個存儲過程和作業,它將刪除超過一週的模式中的所有表。DROP SQL表如果創建日期超過一個星期 - MS SQL Server
我每天都創建備份,我希望通過安排作業來刪除任何超過一週的備份(SQL表),從而使流程自動化。
您的幫助將不勝感激。
我想在Ms SQL服務器中創建一個存儲過程和作業,它將刪除超過一週的模式中的所有表。DROP SQL表如果創建日期超過一個星期 - MS SQL Server
我每天都創建備份,我希望通過安排作業來刪除任何超過一週的備份(SQL表),從而使流程自動化。
您的幫助將不勝感激。
您可以使用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天中被修改)。
該網頁可以在這裏找到:
,是用於查詢數據庫對象的「元數據」的許多不同的方法一個很好的資源。
當然,上述操作只是簡單地「選擇」需要刪除的表名,並且不會真正從數據庫中刪除(或刪除)該表。
要達到此目的,您需要一種機制來發出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
命令!
您可以使用此查詢來獲取超過一個星期舊錶的列表:
SELECT
[name]
,create_date
FROM
sys.tables
WHERE DATEDIFF(day, create_date, getdate()) > 7
在SP
所以,你可以寫一篇SP遍歷表,從該查詢返回並刪除它們。你必須考慮到,如果表中有外鍵,刪除它們的順序很重要,所以如果這是你的場景,這個想法可能需要一些tweeking。
非常感謝! – 2010-01-13 11:19:12
小調,我會添加條件[AND xtype ='U'查詢]對sysObjects – Sparky 2010-01-13 12:30:36
@Sparky - 是的,好點。爲了好處,如果原始海報,這個附加子句([AND xtype ='U'查詢])將確保只有用戶表(即你自己創建的)在查詢中被檢索到,而不是潛在地刪除「系統「表(即SQL Server自己添加的東西) – CraigTP 2010-01-13 13:03:29