[sql] 이름이 특정 문자열로 시작하는 모든 테이블을 삭제하십시오.

이름이 주어진 문자열로 시작하는 모든 테이블을 어떻게 삭제할 수 있습니까?

동적 SQL 및 INFORMATION_SCHEMA테이블을 사용 하여이 작업을 수행 할 수 있다고 생각합니다 .



답변

데이터베이스에 소유자가 둘 이상인 경우 소유자를 포함하도록 쿼리를 수정해야 할 수도 있습니다.

DECLARE @cmd varchar(4000)
DECLARE cmds CURSOR FOR
SELECT 'drop table [' + Table_Name + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE Table_Name LIKE 'prefix%'

OPEN cmds
WHILE 1 = 1
BEGIN
    FETCH cmds INTO @cmd
    IF @@fetch_status != 0 BREAK
    EXEC(@cmd)
END
CLOSE cmds;
DEALLOCATE cmds

이것은 스크립트 생성 및 실행의 2 단계 접근 방식을 사용하는 것보다 깨끗합니다. 그러나 스크립트 생성의 한 가지 장점은 실제로 실행되기 전에 실행할 내용을 모두 검토 할 수 있다는 것입니다.

프로덕션 데이터베이스에 대해이 작업을 수행하려는 경우 가능한 한 조심해야한다는 것을 알고 있습니다.

수정 코드 샘플이 수정되었습니다.


답변

SELECT 'DROP TABLE "' + TABLE_NAME + '"'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'

스크립트가 생성됩니다.

삭제하기 전에 테이블이 있는지 확인하는 절 추가 :

SELECT 'IF OBJECT_ID(''' +TABLE_NAME + ''') IS NOT NULL BEGIN DROP TABLE [' + TABLE_NAME + '] END;'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'


답변

그러면 외래 키 순서로 테이블이 표시되고 SQL Server에서 생성 된 테이블 중 일부가 삭제되지 않습니다. 이 t.Ordinal값은 테이블을 종속성 계층으로 분할합니다.

WITH TablesCTE(SchemaName, TableName, TableID, Ordinal) AS
(
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
        OBJECT_NAME(so.object_id) AS TableName,
        so.object_id AS TableID,
        0 AS Ordinal
    FROM sys.objects AS so
    WHERE so.type = 'U'
        AND so.is_ms_Shipped = 0
        AND OBJECT_NAME(so.object_id)
        LIKE 'MyPrefix%'

    UNION ALL
    SELECT OBJECT_SCHEMA_NAME(so.object_id) AS SchemaName,
        OBJECT_NAME(so.object_id) AS TableName,
        so.object_id AS TableID,
        tt.Ordinal + 1 AS Ordinal
    FROM sys.objects AS so
        INNER JOIN sys.foreign_keys AS f
            ON f.parent_object_id = so.object_id
                AND f.parent_object_id != f.referenced_object_id
        INNER JOIN TablesCTE AS tt
            ON f.referenced_object_id = tt.TableID
    WHERE so.type = 'U'
        AND so.is_ms_Shipped = 0
        AND OBJECT_NAME(so.object_id)
        LIKE 'MyPrefix%'
)
SELECT DISTINCT t.Ordinal, t.SchemaName, t.TableName, t.TableID
FROM TablesCTE AS t
    INNER JOIN
    (
        SELECT
            itt.SchemaName AS SchemaName,
            itt.TableName AS TableName,
            itt.TableID AS TableID,
            Max(itt.Ordinal) AS Ordinal
        FROM TablesCTE AS itt
        GROUP BY itt.SchemaName, itt.TableName, itt.TableID
    ) AS tt
        ON t.TableID = tt.TableID
            AND t.Ordinal = tt.Ordinal
ORDER BY t.Ordinal DESC, t.TableName ASC


답변

Oracle XE에서는 다음과 같이 작동합니다.

SELECT 'DROP TABLE "' || TABLE_NAME || '";'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

또는 제약 조건제거하고 공간을 확보 하려면 다음을 사용하십시오.

SELECT 'DROP TABLE "' || TABLE_NAME || '" cascade constraints PURGE;'
FROM USER_TABLES
WHERE TABLE_NAME LIKE 'YOURTABLEPREFIX%'

어떤 DROP TABLE cascade constraints PURGE진술을 생성 할 것입니다 …

위해 VIEWS이것을 사용 :

SELECT 'DROP VIEW "' || VIEW_NAME || '";'
FROM USER_VIEWS
WHERE VIEW_NAME LIKE 'YOURVIEWPREFIX%'


답변

@Xenph Yan을 기반으로하는 모든 WordPress 테이블을 삭제하기 위해 mysql 문을 찾을 때이 게시물을 보았습니다.

SELECT CONCAT(  'DROP TABLE `', TABLE_NAME,  '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE  'wp_%'

이렇게하면 모든 테이블에 대한 일련의 삭제 쿼리가 wp_로 시작합니다.


답변

내 해결책은 다음과 같습니다.

SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';

물론 TABLE_PREFIX_GOES_HERE접두사 로 바꿔야 합니다.


답변

EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

편집하다:

sp_MSforeachtable은 문서화되지 않았으므로 동작은 MS_SQL 버전에 따라 달라질 수 있으므로 프로덕션에는 적합하지 않습니다.