Esta consulta se rellenará una tabla temporal que tiene solamente aquellos en los que al final del nombre de la tabla es una fecha:
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;
La siguiente parte es eliminar todas las tablas que siguen siendo "actual" - lo que significa que la fecha extensión está dentro de su ventana de 12 meses:
DELETE FROM #M
WHERE DATEADD(MONTH, -12, TableDate) < GETDATE();
Ahora uno se queda con sólo las tablas encontradas en #M
, lo que sólo puede recorrer en cualquier manera que le gustaría, ejecutar SQL dinámico para eliminar la tabla (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;
Para la limpieza, eliminar la tabla temporal, así:
DROP TABLE #M;
+1 eficiente y libre de bucles –
Muy bien, gracias :) –