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


195

SQL Server 데이터베이스를 완전히 비울 스크립트를 작성하려고합니다. 이것이 지금까지 내가 가진 것입니다.

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

Management Studio에서 실행하면 다음과 같은 이점이 있습니다.

명령이 성공적으로 완료되었습니다.

그러나 테이블 목록을 새로 고치면 모두 그대로 있습니다. 내가 뭘 잘못하고 있죠?


[데이터베이스 이름] GO 사용 :이 페이지의 해결책으로 작동하지 않으면, 아마 당신은 잊었
Serj 세이건

2
삭제? 테이블에서 레코드를 삭제합니다. DROP TABLE?을 사용해야하지만 다른 이유로 작동하지 않습니다.
datagod

답변:


306

외래 키 테이블이 여러 개인 경우에는 작동하지 않습니다.
나는 작동하고 시도하는 모든 것을 수행하는 코드를 발견했습니다 (데이터베이스에서 모든 테이블을 삭제하십시오).

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' +  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

여기 에서 게시물을 찾을 수 있습니다 . Groker의 글입니다.


BEGIN-END 블록을 사용하여 IF 문에서 해당 코드 전체를 랩핑하려고 할 때 커서에 대해 불평하는 이유는 무엇입니까?
Adam

11
오류가 발생했습니다Could not find stored procedure 'sp_MSForEachTable'.
Korayem

2
와 다른 스키마에 테이블 (제약 조건이있는)이 있으면이 답변이 작동하지 않습니다 dbo. 사용자 정의 스키마가있는 경우, 당신은 변경해야 sqlSELECT DISTINCT sql = 'ALTER TABLE [' + tc2.CONSTRAINT_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
Asbjørn Ulsberg

5
sp_MSforeachtableAzure에서는 사용할 수 없습니다. 대신 @CountZero의 답변을 사용하십시오.
Ogglas

3
웹에서이 참조를 찾았습니다 (광산 아님). Azure의 경우 sp_MSforeachtable 저장 프로 시저의 복사본 sp_MSforeach_worker : gist.github.com/metaskills/893599를 사용 하십시오 .
João Vieira

332

SQL 스크립트를 사용하지 않고 MSSMS UI 도구 만 사용하여 데이터베이스에서 모든 테이블을 삭제할 수도 있습니다. 때로는이 방법이 더 편안 할 수 있습니다 (특히 가끔 수행하는 경우)

다음과 같이 단계별로이 작업을 수행합니다.

  1. 데이터베이스 트리에서 '테이블'을 선택하십시오 (오브젝트 탐색기).
  2. F7을 눌러 오브젝트 탐색기 세부 사항보기를여십시오.
  3. 이보기에서 삭제해야하는 테이블을 선택하십시오 (이 경우 모두).
  4. 모든 테이블이 삭제 될 때까지 Delete 키를 계속 누르십시오 (키 제한 조건 / 종속성으로 인해 많은 양의 오류가 반복됨)

5
sp_msforeachtable을 Azure sql db에서 작동시킬 수 없습니다. Azure에 포함하지 않는 것 같습니다. 이 솔루션은 EF 마이그레이션으로 조롱하거나 많은 변경 (다시 시작) 할 때 완벽하게 작동합니다.
trevorc

FK / 주문을 고려하지 않습니다.
Josh

1
이 방법은 여기저기서해야 할 경우 편리한 방법이며, 자주하는 경우 스크립트가 더 나을 수 있습니다.
Dylan Hayes

2
@ 조쉬 순서는 고려되지 않지만 삭제 대화 상자에서 확인을 계속 누르면 가능한 모든 테이블이 계속 삭제되어 결국 모든 테이블이 삭제됩니다.
clayRay

디자이너를 사용한 완벽한 솔루션
Zaheer

49

SSMS에서 :

  • 데이터베이스를 마우스 오른쪽 버튼으로 클릭하십시오
  • "작업"으로 이동
  • "스크립트 생성"을 클릭하십시오
  • "개체 선택"섹션에서 "전체 데이터베이스 및 모든 데이터베이스 개체 스크립트"를 선택하십시오.
  • "스크립팅 옵션 설정"섹션에서 "고급"버튼을 클릭하십시오.
  • "Script DROP and CREATE"에서 "Script CREATE"를 "Script DROP"으로 전환하고 OK를 누릅니다.
  • 그런 다음 파일, 클립 보드 또는 새 쿼리 창에 저장하십시오.
  • 스크립트를 실행하십시오.

이제 데이터베이스를 포함한 모든 것이 삭제됩니다. 떨어 뜨리고 싶지 않은 항목의 코드를 제거하십시오. 또는 "객체 선택"섹션에서 전체 데이터베이스를 스크립팅하도록 선택하는 대신 제거 할 항목을 선택하십시오.


3
데이터베이스를 삭제하지 않으려는 경우 (내 경우에는 생성을 위해 지원 호출이 필요하지 않음) '특정 데이터베이스 객체 선택'을 사용하고 모든 객체 유형을 선택하십시오. 떨어 뜨리고 싶다.
d219

3
이것이 가장 쉬운 방법입니다.
Asiri Dissanayaka

2
이것은 확실한 대답이어야합니다!
Zac Taylor

34

delete테이블에서 행을 삭제하는 데 사용됩니다. drop table대신 사용해야 합니다.

EXEC sp_msforeachtable 'drop table [?]'

그것은 오류가 없다는 문제를 해결 한 것처럼 보였지만 이제는 제약 조건 오류가 발생했습니다. 내 NOCHECK CONSTRAINT줄 의 구문이 잘못 되었습니까?
dixuji

1
FK와 함께 빠른 2 테이블에서 이것을 사용했으며 효과가있었습니다. EXEC sp_msforeachtable 'ALTER TABLE? NOCHECK CONSTRAINT all '
DaveShaw

12
EXEC sp_msforeachtable 'drop table?'을 대괄호를 제거한 후에 만 ​​나에게 도움이되었습니다.
LPains

테이블 이름에 홀수 문자 나 공백이 있으면 SQL Server에서 대괄호가 필요합니다. 개체 이름 주위에 대괄호를 지원하지 않는 SQL Server 버전을 알지 못했습니다.
DaveShaw

SQL Server 2012 (11.x)에서도 대괄호를 제거해야했습니다.
Frieder

30

허용되는 답변은 Azure를 지원하지 않습니다. 문서화되지 않은 저장 프로 시저 "sp_MSforeachtable"을 사용합니다. 실행 중 "azure에서 저장 프로 시저 'sp_msforeachtable"을 찾을 수 없거나 오류가 발생하거나 문서화되지 않은 기능에 의존하지 않으려면 (언제든지 제거하거나 기능을 변경할 수 있음) 아래에서 시도하십시오.

이 버전은 엔티티 프레임 워크 마이그레이션 히스토리 테이블 "__MigrationHistory"및 삭제할 권한이없는 Azure 테이블 인 "database_firewall_rules"를 무시합니다.

Azure에서 가볍게 테스트했습니다. 이것이 환경에 바람직하지 않은 영향을 미치지 않도록 확인하십시오.

DECLARE @sql NVARCHAR(2000)

WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY'))
BEGIN
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC(@sql)
    PRINT @sql
END

WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'))
BEGIN
    SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'
    EXEC(@sql)
    PRINT @sql
END

에서 가져온 :

https://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/

http://www.sqlservercentral.com/blogs/sqlservertips/2011/10/11/remove-all-foreign-keys/


3
푸른 마법에 작용했습니다. VS의 UI를 통해 훨씬 더 빠르게 제거
Simeon Grigorovich

27
/* 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

1
SQL Azure에서 작동 :) sp_MSforeachtable이 작동하지 않습니다
Pavel Biryukov

참고로, 비 dbo 스키마가있는 경우 (예 : Hangfire를 사용하는 경우)
Liam Dawson

21

거의 옳았습니다. 대신 사용하십시오.

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

그러나 두 번째 줄은 오류가 발생하지 않을 때까지 한 번 이상 실행해야 할 수도 있습니다.

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

메시지:

Command(s) completed successfully.

모든 테이블이 성공적으로 삭제되었음을 의미합니다.


17

짧고 달다:

USE YOUR_DATABASE_NAME
-- 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

2
나는 대체했다 sp_msforeachtablesp_MSforeachtable하고 고도로을 추가하는 것이 좋습니다 use yourdatabase첫 번째 줄. 매력처럼 일했다.
Simon Sobisch 2016 년

짧고 달다! Thnx.
sapatelbaps '

7

금식하는 방법은 다음과 같습니다.

  1. 새로운 데이터베이스 다이어그램
  2. 모든 테이블 추가
  3. 모두 선택하려면 Ctrl + A
  4. "데이터베이스에서 제거"를 마우스 오른쪽 단추로 클릭하십시오.
  5. 저장하려면 Ctrl + S
  6. 즐겨

이것은 훨씬 빠르고 오류가 발생하기 쉬운 방법입니다. 이것이 정답입니다.
DARKGuy

6

명령은 사각형 담요가 없어야합니다

EXEC sp_msforeachtable 'drop table ?'

6

가장 쉬운 방법은 다음과 같습니다.

--First delete all constraints

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

EXEC sys.sp_executesql @sql;

-- Then drop all tables

exec sp_MSforeachtable 'DROP TABLE ?'

2

에 딱 맞다!!

아래 쿼리를 사용하여 데이터베이스에서 모든 테이블을 제거 할 수 있습니다

EXEC sp_MSforeachtable @ command1 = "DROP TABLE?"

행복한 코딩!


1

전체 데이터베이스를 삭제 한 다음 다시 작성하는 것은 어떻습니까? 이것은 나를 위해 작동합니다.

DROP DATABASE mydb;
CREATE DATABASE mydb;

당신은 사이에 mdf 및 ldf 파일을 폭발 할 필요가 없습니까?
ruffin

웹 호스트 제공 업체를 사용하고 있으며 확실하지 않습니다. 오프라인이 아닌 한 데이터베이스를 삭제하면 해당 파일이 자동으로 삭제된다고 생각합니다.
Chong Lip Phang 5

2
실제로 상황에 따라 다릅니다. 필자의 경우 저장 프로 시저가 없으며이 방법이 적합합니다. 두 줄이있을 때 수십 줄에 걸친 복잡한 코드를 작성하지 않을 것입니다. 특정 사용자 그룹에게 제안을 제안 할 때 내 답변이 다운 보트를 정당화한다고 생각하지 않습니다.
Chong Lip Phang

0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 많은 데이터베이스에서 여기에 대한 모든 대답을 시도했으며 SQL Server의 다양한 단점에 대해 모든 시간이 작동하지만 항상 작동하지는 않는다는 것을 알았습니다.

결국 나는 이것을 생각해 냈습니다. 나는 가능한 모든 곳에서 (일반적으로 말하면) 이것을 테스트했으며 (숨겨진 상점 절차없이) 작동합니다.

주로 SQL Server 2014에 대한 참고 사항입니다 (그러나 다른 버전의 대부분은 제대로 작동하는 것 같습니다).

while 루프와 null 등, 커서 및 기타 다양한 형식을 시도했지만 항상 일부 데이터베이스에서는 실패하지만 다른 이유는 없습니다.

계산을 반복하고 반복하여 사용하면 항상 테스트 한 모든 항목에서 작동하는 것 같습니다.

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

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

0

위해 임시 테이블 이 좀 더 사실에 일부 외국 키도 예외가있을 수 있습니다 때문에 복잡하다 :

Drop table operation failed on table XXX because it is not a supported operation on system-versioned temporal tables

사용할 수있는 것 :

-- Disable constraints (foreign keys)
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Disable system versioning (temporial tables)
EXEC sp_MSForEachTable '
 IF OBJECTPROPERTY(object_id(''?''), ''TableTemporalType'') = 2
  ALTER TABLE ? SET (SYSTEM_VERSIONING = OFF)
'
GO

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