복붙노트

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

SQL

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

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

나는이 일부 동적 SQL 및 INFORMATION_SCHEMA 테이블을 함께 할 수 있다고 생각합니다.

해결법

  1. ==============================

    1.당신은 데이터베이스에 하나 이상있을 경우 소유자를 포함하도록 쿼리를 수정해야 할 수도 있습니다.

    당신은 데이터베이스에 하나 이상있을 경우 소유자를 포함하도록 쿼리를 수정해야 할 수도 있습니다.

    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. ==============================

    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]%'
    
  3. ==============================

    3.이렇게하면 외래 키 순서로 테이블을 얻을 SQL 서버에 의해 생성 된 테이블의 일부를 떨어 뜨리지 않도록합니다. t.Ordinal 값 종속 층에 표를 슬라이스한다.

    이렇게하면 외래 키 순서로 테이블을 얻을 SQL 서버에 의해 생성 된 테이블의 일부를 떨어 뜨리지 않도록합니다. 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
    
  4. ==============================

    4.오라클 XE에이 작동합니다 :

    오라클 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 캐스케이드 제약 퍼지 문의 무리를 생성합니다 ...

    뷰에 대한이를 사용 :

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

    5.여기 내 솔루션입니다 :

    여기 내 솔루션입니다 :

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

    물론 당신은 당신의 접두어로 TABLE_PREFIX_GOES_HERE를 교체해야합니다.

  6. ==============================

    6.

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

    편집하다:

    그것의 행동이 MS_SQL 버전에 따라 달라질 수 있기 때문에 sp_MSforeachtable, 따라서 생산에 적합하지 문서화되어있다.

  7. ==============================

    7.

    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
    
  8. ==============================

    8.나는 여기에 내가 결국 무슨 짓을 내가 @Xenph 연의를 기반으로 모든 워드 프레스 테이블을 드롭 MySQL의 문을 찾고 있었어요이 게시물을 보았다 :

    나는 여기에 내가 결국 무슨 짓을 내가 @Xenph 연의를 기반으로 모든 워드 프레스 테이블을 드롭 MySQL의 문을 찾고 있었어요이 게시물을 보았다 :

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

    모든 테이블에 대해 당신에게 드롭 쿼리의 집합을 줄 것이다이 wp_ 시작

  9. ==============================

    9.Xenph 얀의 대답은 훨씬 청소기 나보다했지만 여기에 광산은 모두 동일합니다.

    Xenph 얀의 대답은 훨씬 청소기 나보다했지만 여기에 광산은 모두 동일합니다.

    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
    

    당신이 검색하려는 문자에 그냥 변경 테이블의 이름입니다.

  10. ==============================

    10.이것은 나를 위해 일했다.

    이것은 나를 위해 일했다.

    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;
    
  11. ==============================

    11.

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

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

  12. ==============================

    12.

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

    13.나는 기본 스키마에 테이블을하지했기 때문에 나는 의심 Xenph 얀의 대답에 약간의 유도를해야했다.

    나는 기본 스키마에 테이블을하지했기 때문에 나는 의심 Xenph 얀의 대답에 약간의 유도를해야했다.

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

    14.임시 테이블의 경우, 당신은 시도 할 수도

    임시 테이블의 경우, 당신은 시도 할 수도

    SELECT 'DROP TABLE "' + t.name + '"' 
    FROM tempdb.sys.tables t
    WHERE t.name LIKE '[prefix]%'
    
  15. from https://stackoverflow.com/questions/4393/drop-all-tables-whose-names-begin-with-a-certain-string by cc-by-sa and MIT license