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


150

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

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

답변:


151

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

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

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

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


5
마스터 테이블과 세부 테이블 간의 외래 키 제약 조건으로 인해이 스크립트를 여러 번 실행해야 할 수도 있습니다.
Alexander Prokofyev

7
SQL Server 2005에서는 마지막 두 줄을로 변경해야했습니다 close cmds; deallocate cmds.
Hamish Grubijan

경고 :이 솔루션은 SQL Server에서 만든 테이블을 삭제할 수도 있습니다! 아래의 솔루션은 이것을 피하고 외래 키 종속성 순서로 테이블을 삭제합니다.
Tony O'Hagan 1

이것은 나를 위해 작동하지 않았습니다. 이 질문에 대한 답변이 작동했습니다 : stackoverflow.com/questions/5116296/…
Ayushmati

115
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]%'

10
"접두사"를 대상 접두사로 바꿀 때 대괄호를 제거하기 위해 추가 할 수 있습니다.
Levitikon

10
MYSQL :이 스레드를 찾은 사람들을 위해 "conpre _ ( 'DROP TABLE', TABLE_NAME,"; ")을 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '[prefix] %'에서 데이터로 선택하십시오.
Andre

1
결과는 또한 전망을 포함한다
Ondra

1
접두사의 일부인 경우 _를 이스케이프하는 것을 잊지 마십시오 (예 : WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
EM0

3
이것은 스크립트를 생성하지만 어떻게 스크립트를 실행합니까?
daOnlyBG

16

그러면 외래 키 순서로 테이블이 표시되고 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


3
빠른 수정 : TableName은 WHERE 절에 몇 번 나타나며 OBJECT_NAME (so.object_id)으로 바꿔야합니다. 좋은 대본!
witttness

6

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%'

완벽하게 작동했습니다. QA에 사용 된 DB에서 삭제할 61,037 개의 빈 테이블이 있습니다. 캐스케이드 제약 예제를 사용했습니다. 출력을 생성 한 다음이를 스크립트로 모두 복사하여 실행했습니다. 영원히 걸렸지 만 그것은 매력처럼 작동했습니다! 감사!
tehbeardedone

5

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

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

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


5

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

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

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


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

편집하다:

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


멋진 원 라이너! 이것은 상단에 투표해야합니다.
user3413723

4
CREATE PROCEDURE usp_GenerateDROP
    @Pattern AS varchar(255)
    ,@PrintQuery AS bit
    ,@ExecQuery AS bit
AS
BEGIN
    DECLARE @sql AS varchar(max)

    SELECT @sql = COALESCE(@sql, '') + 'DROP TABLE [' + TABLE_NAME + ']' + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE @Pattern

    IF @PrintQuery = 1 PRINT @sql
    IF @ExecQuery = 1 EXEC (@sql)
END

2

Xenph Yan 의 대답은 내 것보다 훨씬 깨끗했지만 여기는 모두 같습니다.

DECLARE @startStr AS Varchar (20)
SET @startStr = 'tableName'

DECLARE @startStrLen AS int
SELECT @startStrLen = LEN(@startStr)

SELECT 'DROP TABLE ' + name FROM sysobjects
WHERE type = 'U' AND LEFT(name, @startStrLen) = @startStr

tableName검색하려는 문자로 변경 하십시오.


1

이것은 나를 위해 일했습니다.

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += '
DROP TABLE ' 
    + QUOTENAME(s.name)
    + '.' + QUOTENAME(t.name) + ';'
    FROM sys.tables AS t
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id] 
    WHERE t.name LIKE 'something%';

PRINT @sql;
-- EXEC sp_executesql @sql;

0
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'

-테스트는 테이블 이름입니다


이것은 실제로 아무것도 실행하지 않고 단지 많은 명령을 반환합니다.
Stealth Rabbi

0
SELECT 'if object_id(''' + TABLE_NAME + ''') is not null begin drop table "' + TABLE_NAME + '" end;' 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE '[prefix]%'

0

기본 스키마에 테이블이 없기 때문에 Xenph Yan의 대답에 대해 약간의 파생 작업을 수행해야했습니다.

SELECT 'DROP TABLE Databasename.schema.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME LIKE 'strmatch%'

0

임시 테이블의 경우 시도해 볼 수 있습니다.

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.