Удалить таблицы старше 12 месяцев, используя имя таблицы - PullRequest
5 голосов
/ 15 сентября 2011

Я хочу иметь возможность удалять таблицы старше 12 месяцев.В таблицах указана дата (месяц и год).Например, TABLE_A_2011_01 имеет дату January 2011.

. Я хочу удалить те таблицы, в которых часть даты старше 12 месяцев.Если сегодняшняя дата September 15, 2011, я хочу удалить все таблицы старше September 15, 2010.

Ответы [ 3 ]

4 голосов
/ 15 сентября 2011
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;
2 голосов
/ 15 сентября 2011

Этот запрос будет заполнять временную таблицу, имеющую только те, в которых конец имени таблицы является датой:

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;
0 голосов
/ 15 сентября 2011

Если дата является последней 7, тогда это должно работать, чтобы дать вам даты списка. Я не мог проверить последнее, так как ни одна из моих таблиц не соответствует этому формату. Проблема в том, что если какое-либо из имен таблиц не соответствует этому формату, тогда выбор завершается неудачно. Вам нужно будет добавить синтаксис удаления / удаления, но, надеюсь, вы получите список.

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...