2011-09-15 3 views
5

12 개월보다 오래된 테이블을 삭제할 수 있기를 원합니다. 테이블에는 이름에 날짜 (월 및 연도)가 있습니다. 예를 들어 TABLE_A_2011_01의 날짜는 January 2011입니다.테이블 이름을 사용하여 12 개월보다 오래된 테이블을 삭제하십시오.

내가 원하는 것은 날짜 부분이 12 개월 이상인 테이블을 삭제하는 것입니다. 오늘 날짜가 September 15, 2011 인 경우 September 15, 2010보다 오래된 모든 테이블을 삭제하려고합니다.

답변

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 효율적이고 루프가 없습니다 –

+0

아주 좋은, 고마워요 :) –

2

테이블 이름의 끝 날짜입니다 만을 갖는 임시 테이블을 채 웁니다이 질의 :

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(); 
이제

테이블을 드롭 동적 SQL을 실행, 당신은 #M 만 일치하는 테이블 왼쪽하고, 그래서 당신은을 통해 단지 루프가 중 방식으로는 원하는 수 (들) :

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; 

정리를 들어,뿐만 아니라 임시 테이블을 삭제 : 날짜 다음이 당신에게 목록 날짜를주는 작업을해야 지난 7

DROP TABLE #M; 
0

합니다. 내 테이블 중 아무 것도 그 형식을 따르지 않기 때문에 나는 마지막으로 테스트 할 수 없었습니다. 이 문제는 테이블 이름이 해당 형식을 준수하지 않으면 선택이 실패한다는 것입니다. 삭제/삭제 구문을 추가해야하지만 잘하면 목록이 생성됩니다.

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

는 윽의 대답은 더 좋다. 그 일을 시작했을 때 그분은 게시되지 않았습니다. – Paparazzi

관련 문제