SQL Serverデータベースのすべてのテーブルを削除する方法は?


195

SQL Serverデータベースを完全に空にするスクリプトを記述しようとしています。これは私がこれまでに持っているものです:

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

Management Studioで実行すると、次のようになります。

コマンドが正常に完了しました。

しかし、テーブルリストを更新しても、すべて表示されたままです。何が悪いのですか?


このページのどのソリューションも機能しない場合は、おそらく次のことを忘れていました
。USE

2
削除しますか?テーブルからレコードを削除します。DROP TABLE?を使用する必要がありますが、他の理由で機能しません。
datagod 16

回答:


305

複数の外部キーテーブルがある場合にも機能しません。
私はそのコードが機能し、あなたがしようとするすべてを実行することを発見しました(データベースからすべてのテーブルを削除します):

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ステートメントでラップしようとすると、カーソルについて問題があるのはなぜですか?
アダム

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ørnUlsberg

5
sp_MSforeachtableAzureでは利用できません。代わりに@CountZeroの回答を使用してください。
オグラス

3
このリファレンスをWebで見つけました(私のものではありません):sp_MSforeachtableストアドプロシージャのコピー(Azureの場合)sp_MSforeach_worker:gist.github.com/metaskills/893599を使用します。
ジョアン・ヴィエイラ

330

MSSMS UIツールのみを使用して(SQLスクリプトを使用せずに)データベースからすべてのテーブルを削除することもできます。時々この方法はより快適になることがあります(特にそれが時々実行される場合)

私はこれを次のように段階的に行います:

  1. データベースツリー(オブジェクトエクスプローラー)で[テーブル]を選択します
  2. F7キーを押してオブジェクトエクスプローラーの詳細ビューを開きます
  3. このビューで、削除する必要があるテーブルを選択します(この場合はすべて)
  4. すべてのテーブルが削除されるまで[削除]を押し続けます(キーの制約/依存関係によるエラーの数だけ繰り返します)

5
Azure SQLデータベースでsp_msforeachtableを機能させることができませんでした。Azureには含まれていないと思います。このソリューションは優れており、EFの移行をモックしたり、多くの変更(やり直し)を行う場合に最適です。
trevorc

FK /注文を考慮しません。
Josh

1
これは、あちこちで実行する必要がある場合に便利な方法です。頻繁に実行する場合は、スクリプトの方が良い場合があります。
ディランヘイズ

2
@ジョッシュの順序は考慮されませんが、[削除]ダイアログで[OK]を押し続けると、可能なすべてのテーブルが削除され続け、最終的にすべてのテーブルが削除されます。
clayRay

Designerを使用した完璧なソリューション
Zaheer 2018年

48

SSMSの場合:

  • データベースを右クリック
  • 「タスク」に移動
  • 「スクリプトの生成」をクリックします
  • [オブジェクトの選択]セクションで、[データベース全体とすべてのデータベースオブジェクトをスクリプト化]を選択します。
  • [スクリプトオプションの設定]セクションで、[詳細設定]ボタンをクリックします。
  • [スクリプトのドロップと作成]で[スクリプトの作成]を[スクリプトのドロップ]に切り替え、[OK]を押します
  • 次に、ファイル、クリップボード、または新しいクエリウィンドウに保存します。
  • スクリプトを実行します。

これで、データベースを含むすべてが削除されます。ドロップしたくないアイテムのコードは必ず削除してください。または、[オブジェクトの選択]セクションで、データベース全体をスクリプト化する代わりに、削除するアイテムを選択するだけです。


3
データベースを削除したくない場合(私の場合は、作成しないためにサポートコールを行う必要があるため、データベースを削除しません)、[特定のデータベースオブジェクトを選択する]を使用して、データベースタイプをすべて選択します。あなたはドロップしたいです。
d219

3
これが最も簡単な方法です。
Asiri Dissanayaka 2018

2
これは確かに答えになるはずです!
ザックテイラー

34

deleteテーブルから行を削除するために使用されます。drop table代わりに使用する必要があります。

EXEC sp_msforeachtable 'drop table [?]'

これでエラーがないという問題は修正されたようですが、今は制約エラーが発生しています。私のNOCHECK CONSTRAINT行の構文は間違っていますか?
dixuji 2011

1
私はFKのクイック2テーブルでこれを使用しましたが、うまくいきました。EXEC sp_msforeachtable 'ALTER TABLE?NOCHECK CONSTRAINT all '
DaveShaw

12
これは、角かっこを削除した後でのみ機能しました:EXEC sp_msforeachtable 'drop table?'。
LPain 2015年

SQL Serverでは、テーブル名に奇妙な文字やスペースが含まれている場合は、ブラケットが必要です。オブジェクト名の前後の角かっこをサポートしていないSQL Serverのバージョンは知りません。
DaveShaw、2015年

SQL Server 2012(11.x)では、角かっこも削除する必要がありました。
Frieder、

30

受け入れられた回答はAzureをサポートしていません。ドキュメントに記載されていないストアドプロシージャ "sp_MSforeachtable"を使用しています。実行中に「アズールがストアドプロシージャ '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 ?'

しかし、2行目では、エラーが発生しなくなるまで、もう一度実行する必要がある場合があります。

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 2017年

短くて甘い!Thnx。
sapatelbaps

7

断食の方法は:

  1. 新しいデータベースダイアグラム
  2. すべてのテーブルを追加
  3. Ctrl + Aですべて選択
  4. 「データベースから削除」を右クリックします
  5. 保存するにはCtrl + S
  6. 楽しい

これは、これを実行するための最も高速でエラーが発生しにくい方法です。これは受け入れられる答えになるはずです。
DARKGuy


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 2015

私はWebホストプロバイダーを使用していますが、それについてはあまりわかりません。オフラインでない限り、データベースを削除すると、これらのファイルは自動的に削除されると思います。
Chong Lip Phang 2015

2
それは本当に状況次第です。私の場合、ストアドプロシージャがなく、この方法でうまくいきます。2行で十分な場合は、数十行にわたる複雑なコードは記述しません。私は特定のユーザーグループに提案を提供しているので、私の回答が反対票を正当化するとは思いません。
Chong Lip Phang 2015年

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.