12ヶ月以上経過したテーブルを削除したいと考えています。テーブルの名前には日付(月と年)があります。たとえば、TABLE_A_2011_01
の日付はJanuary 2011
です。テーブル名を使用して12か月を超えるテーブルを削除する
私がしたいのは、日付部分が12か月以上経過していないテーブルを削除することです。今日の日付がSeptember 15, 2011
なら、私はSeptember 15, 2010
より古いすべてのテーブルを削除したいと思います。
12ヶ月以上経過したテーブルを削除したいと考えています。テーブルの名前には日付(月と年)があります。たとえば、TABLE_A_2011_01
の日付はJanuary 2011
です。テーブル名を使用して12か月を超えるテーブルを削除する
私がしたいのは、日付部分が12か月以上経過していないテーブルを削除することです。今日の日付がSeptember 15, 2011
なら、私はSeptember 15, 2010
より古いすべてのテーブルを削除したいと思います。
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;
このクエリは、テーブル名の末尾に日付ですのみを有するもので一時テーブルを移入します:
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;
場合。私のテーブルのどれもがそのフォーマットに従っていないので、私は本当に最後をテストすることができませんでした。この問題は、テーブル名のいずれかがその形式に準拠していなければ、選択が失敗するということです。削除/削除の構文を追加する必要がありますが、うまくいけばリストが表示されます。
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
ウエッからの答えは優れています。私がこれを始めたとき、彼は投稿されませんでした。 – Paparazzi
+1効率的かつループフリー –
非常に良い、ありがとう:) –