이름이 주어진 문자열로 시작하는 모든 테이블을 어떻게 삭제할 수 있습니까?
동적 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 버전에 따라 달라질 수 있으므로 프로덕션에는 적합하지 않습니다.