문제

이름이 주어진 문자열로 시작하는 모든 테이블을 삭제하는 스크립트를 원합니다.나는 이것이 동적 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%'
EXEC sp_MSforeachtable 'if PARSENAME("?",1) like ''%CertainString%'' DROP TABLE ?'

편집하다:

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

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

@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 당신의 접두사와 함께.

젠프 얀의 대답은 내 것보다 훨씬 깨끗했지만 여기에는 모두 동일합니다.

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 검색하려는 문자로 이동합니다.

Curt에게 감사드립니다. 그것은 제가 중간에 겪었던 것과 같은 종류의 솔루션입니다.

하지만 당신의 것이 내 것보다 더 좋습니다. 쉽게 수정할 수 있습니다.선택 항목에 공용체를 추가하고 일부 뷰도 지웠습니다. ;)

declare @cmd varchar(4000)
declare cmds cursor for 
Select 'drop table [' + Table_Name + ']'
From    INFORMATION_SCHEMA.TABLES
Where   Table_Name like 'prefix%'
union
Select 'drop view [' + Table_Name + ']'
From    INFORMATION_SCHEMA.VIEWS
Where   Table_Name like 'prefix%'
open cmds
while 1=1
begin
    fetch cmds into @cmd
    if @@fetch_status != 0 break
    exec(@cmd)
end
close local
deallocate local

걱정하지 마십시오. 프로덕션 데이터베이스가 아닙니다. 이는 단지 작업을 시도하는 동안 내 개발 데이터베이스를 쉽게 정리하기 위한 것입니다.

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

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

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

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

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

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

SELECT 'DROP TABLE "' + t.name + '"' 
FROM tempdb.sys.tables t
WHERE t.name LIKE '[prefix]%'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top