Этот запрос будет заполнять временную таблицу, имеющую только те, в которых конец имени таблицы является датой:
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();
Теперь у вас остались только совпадающие таблицы в #M
, так что вы можете просто циклически проходить любым удобным для вас способом, выполняя динамический SQL для удаления таблиц:
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;
Для очистки также удалите временную таблицу:
DROP TABLE #M;