하나의 SQL 쿼리로 데이터베이스에서 모든 테이블을 삭제하는 방법은 무엇입니까?


176

모든 테이블 이름을 입력하여 모든 테이블을 삭제하고 싶지 않습니다. 하나의 쿼리로 가능합니까?


3
몇 가지 빠른 인터넷 검색 결과 : stackoverflow.com/questions/11053116/…
JSK NS

-(SQLServer의 경우) 더 유용 할 수 있습니다. stackoverflow.com/questions/536350/…

올바른 사용자 이름을 사용하면 자동으로 발생할 수 있습니다 ( 필수 xkcd 링크 ).
Minnow

11
데이터베이스의 테이블에 외래 키가 있습니까? 그렇다면 테이블을 삭제하기 전에이를 고려해야합니다.
Anthony Grist

스키마 바운드 개체가 있으면 테이블을 삭제할 수 없습니다.
Sean Lange

답변:


176

INFORMATION_SCHEMA.TABLES 뷰를 사용하여 테이블 목록을 가져 오십시오. select 문에서 Drop 스크립트를 생성하고 Dynamic SQL을 사용하여 삭제하십시오.

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Sys.Tables 버전

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U'

Exec sp_executesql @sql

참고 :foreign Keys 테이블간에 정의 된 것이 있으면 먼저 아래 쿼리를 실행foreign keys 하여 데이터베이스에있는 모든 항목 을 비활성화 하십시오.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

자세한 내용은 여기를 확인하십시오 .


3
(내 공감이 아님) ... [sys]rdbms의 이식성이 필요하지 않은 경우 일반적으로 스키마보기를 고수 합니다. stackoverflow.com/a/3654313/251174
swasheck


1
@DoubleA-매우 간단합니다. 먼저 내 데이터베이스의 모든 테이블에 대한 Drop 문을 작성하고 변수에 저장합니다. 이를 확인 Print @sql하기 위해 전에 사용할 수 있습니다 exec. 다음을 통해 동적으로 작성된 drop 문을 실행합니다.sp_executesql
P ரதீப்

2
Azure를 사용하는 경우 sp_msforeachtable을 사용할 수 없습니다. @Aaron Bertrand 에서이 달콤한 덩어리를 발견하여 모든 FK 제약 조건을 삭제했습니다. 이 답변으로 정말 잘 작동합니다. dba.stackexchange.com/questions/90033/…
trevorc

3
sp_msforeachtable을 사용할 수없는 경우 다른 테이블에 종속 된 테이블이 삭제되므로 삭제 쿼리를 여러 번 실행할 수도 있습니다.
Maarten Kieft

88

하나의 SQL 쿼리 만 사용하여 모든 테이블을 삭제하려는 경우 다음을 사용할 수 있습니다.

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

이것은 SQL Server의 숨겨진 저장 프로 시저이며 연결된 데이터베이스의 각 테이블마다 실행됩니다.

참고 : 종속성으로 인해 모든 테이블을 삭제하려면 쿼리를 몇 번 실행해야 할 수도 있습니다.

참고 2 : 첫 번째 메모를 피하려면 쿼리를 실행하기 전에 먼저 테이블에 외래 키 관계가 있는지 확인하십시오. 다음 쿼리를 실행하여 외래 키 제약 조건을 비활성화 하십시오.

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
Azure SQL 데이터베이스에서 시도했지만 작동하지 않았습니다. 그러나 위의 답변 (Pprp)이 효과가있었습니다.
Artemious

4
참고로, 모든 테이블을 삭제하기 전에 첫 번째 명령을 여러 번 실행해야하지만 제대로 작동합니다.
Alper

1
@Thatshowweroll은 아마도 테이블의 종속성 때문일 것입니다. 하나의 테이블에 다른 테이블이 있으면 삭제할 수 없습니다.
RageAgainstTheMachine은

1
@RageAgainstTheMachine 예, 여러 개의 상호 종속성이있는 테이블에서 나온 것입니다. 사용자에게 여러 번 실행하도록 알리고 싶습니다. 오류는 문제가되지 않습니다. 첫 번째 명령을 3-4 번 실행 한 다음 두 번째 명령을 1 번 실행하고 BOM을 실행하십시오. 그것은 매력처럼 작동합니다!
Alper

1
@KyleVassella 예, 콘솔이 열려있는 데이터베이스에서만 실행됩니다
RageAgainstTheMachine

39

입력하지 않으려면 다음을 사용하여 명령문을 작성할 수 있습니다.

USE Databasename

SELECT  'DROP TABLE [' + name + '];'
FROM    sys.tables

그런 다음 새 SSMS 창에 복사하여 붙여 넣어 실행하십시오.


테이블 이름은 []로
묶어야

1
QUOTENAME깔끔하게 보이는 것도 사용할 수 있습니다 . 'DROP TABLE ' + QUOTENAME(name) + ';'
P ரதீப்

13

다음 스크립트를 사용하여 다음을 포함한 모든 항목을 삭제할 수도 있습니다.

  • 비 시스템 저장 프로 시저
  • 견해
  • 기능
  • 외래 키 제약
  • 기본 키 제약
  • 테이블

https://michaelreichenbach.de/how-to-drop-everything-in-a-mssql-database/

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)

WHILE @name is not null
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint IS NOT NULL
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
        EXEC (@SQL)
        PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

9

@NoDisplayName의 답변을 약간 변경 QUOTENAME()하고 TABLE_NAME열에서 사용 TABLE_SCHEMA하고 테이블이 dbo스키마에 없는 경우 열을 포함시킵니다 .

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([TABLE_SCHEMA]) + '.' + QUOTENAME([TABLE_NAME]) + ';'
FROM [INFORMATION_SCHEMA].[TABLES]
WHERE [TABLE_TYPE] = 'BASE TABLE';

EXEC SP_EXECUTESQL @sql;

또는 sys@swasheck의 의견에 따라 스키마 뷰를 사용하십시오 .

DECLARE @sql nvarchar(max) = '';

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].[type] = 'U' AND [T].[is_ms_shipped] = 0;

EXEC SP_EXECUTESQL @sql;

4
[sys]rdbms를 통한 이식성이 필요하지 않은 경우 일반적으로 스키마 뷰를 고수 합니다. stackoverflow.com/a/3654313/251174
swasheck

1
@swasheck 꽤 흥미로운 링크에 감사드립니다. sys 스키마 뷰를 사용하는 솔루션으로 답변을 업데이트했습니다.
AeroX


이 때문에 @NoDisplayName 그냥이 할 수있는 , 의미하지 않는다 당신 해야 ... blogs.sqlsentry.com/aaronbertrand/...
아론 버트 랜드

@AaronBertrand-내 나쁜 생각이 더 나은 방법 일 수 있다고 생각했습니다. 지적 해 주셔서 감사합니다.
P ரதீப்

9

Dave.Gugg의 답변에 대한 후속 조치로, 누군가 MySQL에서 모든 DROP TABLE 줄을 가져 오는 데 필요한 코드입니다.

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'

2
질문에 "sql-server"라는 레이블이 붙은 원본 포스터를 알고 있지만 이는 MySQL에서이 작업을 수행하려는 사람에게 유용 할 수 있습니다. 실제로이 질문에 대한 MySQL 솔루션을 검색 할 때이 질문을 찾았으므로 이제 여기에 답변 중 하나를 읽은 후에 생각해 낸 솔루션을 공유하고 있습니다.
OMA

7

가장 간단한 방법은 전체 데이터베이스를 삭제하고 다시 한 번 만드는 것입니다.

drop database db_name
create database db_name

그게 다야.


1
:) 적어도 나를 위해 모든 테이블을 삭제하는 목적은 데이터베이스를 삭제할 수 없기 때문입니다
Hasan Zafari

5
회사 데이터베이스에서이 명령을 실행하지 마십시오. 또는 다른 직업을 찾을 준비를하십시오.
Faraz

@FarazDurrani 쉬운 사람, 모든 테이블을 삭제하는 것도 PROD db에 대한 거래처럼 보이지 않습니다.
감독

5

다른 사람이 최고의 답변 솔루션 (외래 키 비활성화 포함)에 문제가있는 경우 다음과 같은 또 다른 해결책이 있습니다 .

-- CLEAN DB
USE [DB_NAME]
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'DELETE FROM ?'

    DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR
    SET @Cursor = CURSOR FAST_FORWARD FOR

    SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
    LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME
    OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql
    WHILE (@@FETCH_STATUS = 0)
      BEGIN
        Exec SP_EXECUTESQL @Sql
        FETCH NEXT 
        FROM @Cursor INTO @Sql
      END
    CLOSE @Cursor DEALLOCATE @Cursor
    GO

    EXEC sp_MSForEachTable 'DROP TABLE ?'
    GO

    EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL'

3

하나의 쿼리는 아니지만 여전히 짧고 달콤합니다.

-- Disable all referential integrity constraints
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Drop all PKs and FKs
declare @sql nvarchar(max)
SELECT @sql = STUFF((SELECT '; ' + 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('')),1,1,'')
EXECUTE (@sql)
GO

-- Drop all tables
EXEC sp_msforeachtable 'DROP TABLE ?'
GO

3

다음 스크립트를 drop모두 사용하십시오 constraints.

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) +    ' NOCHECK CONSTRAINT all; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

그런 다음 다음을 실행하여 모든 테이블을 삭제하십시오.

select @sql='';

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

이것은 'sp_msforeachtable'사용할 수없는 Azure SQL Database에서 나를 위해 일했습니다 !


1

나는이 질문이 매우 오래되었다는 것을 알고 있지만 매번이 코드가 필요할 때마다 테이블과 뷰 및 함수와 절차가 있으면이 스크립트로 모든 것을 삭제할 수 있습니다. 모든 테이블을 삭제하면 모든보기를 삭제해야하며 함수와 절차가있는 경우 삭제해야하기 때문에
누군가 도움이되기를 바랍니다.

DECLARE @sql NVARCHAR(max)=''

 SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) 
+ '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql


 DECLARE @sql VARCHAR(MAX) = ''
    , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

 SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
 QUOTENAME(v.name) +';' + @crlf
 FROM   sys.views v

 PRINT @sql;
 EXEC(@sql);

 declare @procName varchar(500)
 declare cur cursor 

 for select [name] from sys.objects where type = 'p'
 open cur
 fetch next from cur into @procName
 while @@fetch_status = 0
 begin
  exec('drop procedure [' + @procName + ']')
fetch next from cur into @procName
 end
  close cur
  deallocate cur

  Declare @sql NVARCHAR(MAX) = N'';

    SELECT @sql = @sql + N' DROP FUNCTION ' 
               + QUOTENAME(SCHEMA_NAME(schema_id)) 
               + N'.' + QUOTENAME(name)
    FROM sys.objects
  WHERE type_desc LIKE '%FUNCTION%';

   Exec sp_executesql @sql
  GO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.