2011-09-15 14 views
5

12 aydan eski tabloları bırakmak istiyorum. Tablolar kendi adlarına tarih (ay ve yıl) sahiptir. Örneğin TABLE_A_2011_01, January 2011 tarihine sahiptir.Tablo adını kullanarak 12 aydan daha eski tabloları sil

Yapmak istediğim, tarih bölümünün 12 aydan eski olduğu durumlarda bu tabloları bırakmaktır. Bugünün tarihi September 15, 2011 ise, September 15, 2010'dan daha eski olan tüm tabloları bırakmak istiyorum.

cevap

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 verimli ve loopsuz –

+0

Çok güzel, teşekkürler :) –

2

tablo adı sonu bir tarih olduğu sadece bu olan bir geçici tablo dolduracaktır Bu sorgu:

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; 

sonraki kısmı hala "geçerli" hiçbir tabloları siliyor - Tarihe yani uzantı 12 aylık pencere içinde geçerli:

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

tablo düşmesi dinamik SQL yürütme, sen #M sadece eşleşen tablolardan kalacaksın, bu nedenle aracılığıyla sadece döngü hangisi moda içinde istediğiniz edebilirsiniz (s):

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; 

temizleme için, hem de geçici tablo bırak: tarih o zaman bu size liste tarihleri ​​vermek için çalışması gerektiğini son 7

DROP TABLE #M; 
0

edin. Tablolarımdan hiçbiri bu forma uymadığından sonuncusu test edemedim. Sorun şu ki, tablo adlarından herhangi biri bu forma uymuyorsa, seçim başarısız olur. Sil/drop sözdizimini eklemeniz gerekecek ama umarım bu size bir liste verecektir.

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

Yuck gelen cevap daha iyidir. Bu işe başladığımda yayınlanmadı. – Paparazzi

İlgili konular