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;
+1 verimli ve loopsuz –
Çok güzel, teşekkürler :) –