2011-09-15 10 views
5

12ヶ月以上経過したテーブルを削除したいと考えています。テーブルの名前には日付(月と年)があります。たとえば、TABLE_A_2011_01の日付はJanuary 2011です。テーブル名を使用して12か月を超えるテーブルを削除する

私がしたいのは、日付部分が12か月以上経過していないテーブルを削除することです。今日の日付がSeptember 15, 2011なら、私はSeptember 15, 2010より古いすべてのテーブルを削除したいと思います。

答えて

4
DECLARE @sql NVARCHAR(MAX) = N''; 

;WITH p(o,d) AS 
(
    SELECT QUOTENAME(SCHEMA_NAME([schema_id])) + '.' + QUOTENAME(name), 
     d = RIGHT(REPLACE(name, '_', ''), 6) + '01' 
     FROM sys.tables 
     WHERE ISDATE(RIGHT(REPLACE(name, '_', ''), 6) + '01') = 1 
) 
SELECT @sql += 'DROP TABLE ' + o + ';' FROM p 
    WHERE d < CONVERT(CHAR(8), DATEADD(MONTH, -12, CURRENT_TIMESTAMP), 112); 

PRINT @sql; 
--EXEC sp_executesql @sql; 
+0

+1効率的かつループフリー –

+0

非常に良い、ありがとう:) –

2

このクエリは、テーブル名の末尾に日付ですのみを有するもので一時テーブルを移入します:

SELECT SCHEMA_NAME(T.schema_id) + '.' + T.name TableName, 
    REPLACE((RIGHT(T.name, 7) + '_01'), '_', '-') TableDate 
INTO #M 
FROM sys.tables T 
WHERE ISDATE(REPLACE((RIGHT(T.name, 7) + '_01'), '_', '-')) = 1; 

次の部分は、まだ「現在」のある任意のテーブルを削除している - その日付を意味します拡張機能は、あなたの12ヶ月のウィンドウ内にある:

DELETE FROM #M 
WHERE DATEADD(MONTH, -12, TableDate) < GETDATE(); 

テーブルをドロップするように、動的SQLを実行して、あなたは#Mで唯一のマッチングテーブルに残されているので、あなたが通過だけループはどちらの方法であなたが好きなことができます(秒):

WHILE (EXISTS (SELECT * FROM #M)) BEGIN 
    DECLARE @TableName VarChar(100) = (SELECT TOP 1 TableName FROM #M); 
    DECLARE @SQL NVarChar(1000) = 'DROP TABLE ' + @TableName; 
    EXEC (@SQL); 
    DELETE FROM #M WHERE TableName = @TableName; 
END; 

クリーンアップのために、同様に一時テーブルをドロップ:日付は、これはあなたのリストの日付を与えるために動作するはずの最後の7である

DROP TABLE #M; 
0

場合。私のテーブルのどれもがそのフォーマットに従っていないので、私は本当に最後をテストすることができませんでした。この問題は、テーブル名のいずれかがその形式に準拠していなければ、選択が失敗するということです。削除/削除の構文を追加する必要がありますが、うまくいけばリストが表示されます。

select name from sysobjects where xtype='u' 

    select DATEDIFF(dd, CONVERT(datetime,REPLACE(SUBSTRING('TABLE_C_2010_08',LEN('TABLE_C_2010_08')-6, 7),'_','.') + '.01',101), GETDATE()) 


    select name 
    from sysobjects 
    where xtype='u' 
    and DATEDIFF(dd, CONVERT(datetime,REPLACE(SUBSTRING(name,LEN(name)-6, 7),'_','.') + '.01',101), GETDATE()) > 0 
+0

ウエッからの答えは優れています。私がこれを始めたとき、彼は投稿されませんでした。 – Paparazzi

関連する問題