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

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

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

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

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

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



답변

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

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의 글입니다.


답변

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

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

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

답변

SSMS에서 :

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

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


답변

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

EXEC sp_msforeachtable 'drop table [?]'


답변

허용되는 답변은 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/


답변

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


답변

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

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.

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