이름이 특정 문자열로 시작하는 모든 테이블을 삭제합니다.
이름이 지정된 문자열로 시작하는 테이블을 모두 드롭하려면 어떻게 해야 합니까?
이 작업은 동적 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단계 접근방식을 사용하는 것보다 깔끔합니다.그러나 스크립트 세대의 장점 중 하나는 실제로 실행되기 전에 실행 대상 전체를 검토할 수 있다는 것입니다.
프로덕션 데이터베이스에 대해 이 작업을 수행할 경우 최대한 주의를 기울일 것입니다.
Edit Code 샘플 수정.
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
value는 테이블을 종속 계층으로 슬라이스합니다.
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_MSforeachable은 문서화되어 있지 않기 때문에 동작은 MS_SQL 버전에 따라 다를 수 있습니다.
저의 솔루션은 다음과 같습니다.
SELECT CONCAT('DROP TABLE `', TABLE_NAME,'`;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'TABLE_PREFIX_GOES_HERE%';
그리고 물론, 이 시스템을TABLE_PREFIX_GOES_HERE
를 입력합니다.
@Xenph Yan에 기반한 모든 WordPress 테이블을 드롭하기 위한 mysql 문을 찾던 중 이 게시물을 보았습니다.
SELECT CONCAT( 'DROP TABLE `', TABLE_NAME, '`;' ) AS query
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'wp_%'
그러면 wp_로 시작하는 모든 테이블에 대한 드롭 쿼리 세트가 제공됩니다.
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의 대답은 내 대답보다 훨씬 깨끗했지만 여기 내 답변이 있다.
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
검색 대상 문자에 대해 설명합니다.
이건 나한테 효과가 있었어.
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;
select 'DROP TABLE ' + name from sysobjects
where type = 'U' and sysobjects.name like '%test%'
-- 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]%'
특정 일수보다 오래된 와일드카드(예: "table_20210114")를 기반으로 DROP(드롭 명령 생성 및 선택뿐 아니라) 모든 테이블에 대한 제안서를 게시합니다.
DECLARE
@drop_command NVARCHAR(MAX) = '',
@system_time date,
@table_date nvarchar(8),
@older_than int = 7
Set @system_time = (select getdate() - @older_than)
Set @table_date = (SELECT CONVERT(char(8), @system_time, 112))
SELECT @drop_command += N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME([Name]) + ';'
FROM <your_database_name>.sys.tables
WHERE [Name] LIKE 'table_%' AND RIGHT([Name],8) < @table_date
SELECT @drop_command
EXEC sp_executesql @drop_command
쿼리에서 두 개 이상의 행이 반환되는 경우 결과를 수집하여 쿼리에 병합할 수 있습니다.
declare @Tables as nvarchar(max) = '[schemaName].['
select @Tables =@Tables + TABLE_NAME +'],[schemaName].['
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA = 'schemaName'
AND TABLE_NAME like '%whateverYourQueryIs%'
select @Tables = Left(@Tables,LEN(@Tables)-13) --trying to remove last ",[schemaName].[" part, so you need to change this 13 with actual lenght
--print @Tables
declare @Query as nvarchar(max) = 'Drop table ' +@Tables
--print @Query
exec sp_executeSQL @Query
다음 코드를 사용해 보십시오.
declare @TableLst table(TblNames nvarchar(500))
insert into @TableLst (TblNames)
SELECT 'DROP TABLE [' + Table_Name + ']'
FROM INFORMATION_SCHEMA.TABLES
WHERE Table_Name LIKE 'yourFilter%'
WHILE ((select COUNT(*) as CntTables from @TableLst) > 0)
BEGIN
declare @ForExecCms nvarchar(500) = (select top(1) TblNames from @TableLst)
EXEC(@ForExecCms)
delete from @TableLst where TblNames = @ForExecCms
END
이 SQL 스크립트는 커서를 사용하지 않고 실행됩니다.
외부 키로 링크된 테이블을 갑자기 삭제해야 하는 경우.
USE [CentralIntake]
GO
DECLARE @name VARCHAR(200);
DECLARE @DropForeignKeyProcedure varchar(4000);
DECLARE @DropTableProcedure varchar(4000);
/*TEST*/ SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE Table_Name LIKE '%_unused'
DECLARE tb_cursor CURSOR FOR
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES WHERE Table_Name LIKE '%_unused';
OPEN tb_cursor
FETCH NEXT FROM tb_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
/*TEST*/ SELECT 'ALTER TABLE [' + OBJECT_SCHEMA_NAME(parent_object_id) + '].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT [' + name + ']' FROM sys.foreign_keys WHERE referenced_object_id = object_id(@name)
DECLARE fk_cursor CURSOR FOR
(SELECT 'ALTER TABLE [' + OBJECT_SCHEMA_NAME(parent_object_id) + '].[' + OBJECT_NAME(parent_object_id) + '] DROP CONSTRAINT [' + name + ']'
FROM sys.foreign_keys
WHERE referenced_object_id = object_id(@name));
OPEN fk_cursor
FETCH NEXT FROM fk_cursor INTO @DropForeignKeyProcedure
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC (@DropForeignKeyProcedure);
FETCH NEXT FROM fk_cursor INTO @DropForeignKeyProcedure
END
CLOSE fk_cursor
DEALLOCATE fk_cursor
SET @DropTableProcedure = (SELECT 'DROP TABLE [' + TABLE_CATALOG + '].[' + TABLE_SCHEMA + '].[' + @name + ']'
FROM INFORMATION_SCHEMA.TABLES
where TABLE_NAME = @name)
EXEC(@DropTableProcedure)
FETCH NEXT FROM tb_cursor INTO @name
END
CLOSE tb_cursor
DEALLOCATE tb_cursor
언급URL : https://stackoverflow.com/questions/4393/drop-all-tables-whose-names-begin-with-a-certain-string
'programing' 카테고리의 다른 글
인터페이스의 배후에 있는 실제 방식의 실장에 네비게이트 할 수 있는 방법이 있습니까? (0) | 2023.04.07 |
---|---|
SQL Server의 char, nchar, varchar 및 nvarchar의 차이점은 무엇입니까? (0) | 2023.04.07 |
각도 2 카르마 검정 '구성 요소 이름'이(가) 알려진 요소가 아닙니다. (0) | 2023.04.02 |
프로젝터 또는 javascript를 사용한 브라우저 뒤로 버튼 (0) | 2023.04.02 |
새로 고침 시 Redux 상태 트리를 유지하려면 어떻게 해야 합니까? (0) | 2023.04.02 |