2011-09-15 5 views
5

yo quiero ser capaz de soltar las tablas que son mayores de 12 meses. Las tablas tienen la fecha (mes y año) en su nombre. Por ejemplo, TABLE_A_2011_01 tiene una fecha de January 2011.tablas Eliminar mayores de 12 meses utilizando nombre de la tabla

Lo que quiero hacer es soltar las mesas en las que la parte de fecha tiene más de 12 meses. Si la fecha de hoy es September 15, 2011, quiero eliminar todas las tablas que son anteriores a September 15, 2010.

Respuesta

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 eficiente y libre de bucles –

+0

Muy bien, gracias :) –

2

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; 
0

Si la fecha es el último 7, entonces esto debería funcionar para darle las fechas de la lista. Realmente no pude probar el último ya que ninguna de mis tablas se ajusta a ese formato. El problema que esto tiene es que si alguno de los nombres de la tabla no se ajusta a ese formato, la selección falla. Deberá agregar la sintaxis de eliminar/eliminar, pero con suerte obtendrá una lista.

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

La respuesta de Yuck es mejor. La suya no fue publicada cuando comencé esto. – Paparazzi

Cuestiones relacionadas