이름이 주어진 문자열로 시작하는 모든 테이블을 어떻게 삭제할 수 있습니까?
동적 SQL 및 INFORMATION_SCHEMA
테이블을 사용 하여이 작업을 수행 할 수 있다고 생각합니다 .
이름이 주어진 문자열로 시작하는 모든 테이블을 어떻게 삭제할 수 있습니까?
동적 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 단계 접근 방식을 사용하는 것보다 깨끗합니다. 그러나 스크립트 생성의 한 가지 장점은 실제로 실행되기 전에 실행할 내용을 모두 검토 할 수 있다는 것입니다.
프로덕션 데이터베이스에 대해이 작업을 수행하려는 경우 가능한 한 조심해야한다는 것을 알고 있습니다.
수정 코드 샘플이 수정되었습니다.
close cmds; deallocate cmds
.
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]%'
WHERE TABLE_NAME LIKE 'em\_%' ESCAPE '\';
그러면 외래 키 순서로 테이블이 표시되고 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 의 대답은 내 것보다 훨씬 깨끗했지만 여기는 모두 같습니다.
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%'
-테스트는 테이블 이름입니다