1つのSQLクエリでデータベースからすべてのテーブルを削除する方法は?


176

すべてのテーブルの名前を入力してそれらをすべて削除する必要はありません。1つのクエリで可能ですか?


3
:いくつかの簡単なグーグルでは、この明らかにstackoverflow.com/questions/11053116/...
JSK NS

-although(SQLServerのために)これは、より便利かもしれません:stackoverflow.com/questions/536350/...

正しいユーザー名を使用すると、これは自動的に行われる可能性があります(必須のxkcdリンク)。
ミノー2014

11
データベースのテーブルに外部キーがありますか?その場合は、それを考慮に入れて、テーブルを削除する前に削除する必要があります。
Anthony Grist 14

スキーマバインドオブジェクトがある場合、テーブルを削除できないことに注意してください。
Sean Lange 14

回答:


177

INFORMATION_SCHEMA.TABLESビューを使用して、テーブルのリストを取得します。selectステートメントでDropスクリプトを生成し、動的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

システムテーブルのバージョン

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

1つのSQLクエリのみを使用してすべてのテーブルを削除する場合は、次のように使用できます。

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

これはSQLサーバーの非表示のストアドプロシージャであり、接続しているデータベースの各テーブルに対して実行されます。

注:依存関係のためにすべてのテーブルを削除するには、クエリを数回実行する必要がある場合があります。

注2:最初の注意事項を回避するには、クエリを実行する前に、まず、テーブルに外部キーの関係があるかどうかを確認します。次に、次のクエリを実行して外部キー制約を無効にするだけの場合:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
Azure SQLデータベースで試してみましたが、機能しませんでした。ただし、上記の回答(Prdpによる)は機能しました。
Artemious

4
余談ですが、すべてのテーブルを削除する前に最初のコマンドを複数回実行する必要がありますが、正常に動作します。
アルパー、

1
@Thatshowwerollこれはおそらくテーブルの依存関係が原因です。1つのテーブルに他のテーブルが依存している場合、そのテーブルは削除できません。
RageAgainstTheMachine

1
@RageAgainstTheMachineはい、複数の相互依存関係があるテーブルからのものです。複数回実行するようユーザーに通知したいのですが、エラーは問題ではありません。最初のコマンドを3〜4回実行し、次に2番目のコマンドを1回実行し、BOMを実行します。それは魅力のように機能します!
アルパー、

1
@KyleVassellaはい、これはコンソールを開いているデータベースでのみ実行されます
RageAgainstTheMachine

39

入力したくない場合は、次の文を作成できます。

USE Databasename

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

次に、コピーして新しいSSMSウィンドウに貼り付け、実行します。


テーブル名は[]
Ondra

1
QUOTENAMEすっきりした見た目にも使えます。'DROP TABLE ' + QUOTENAME(name) + ';'
Pரதீப்2016年

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 14

Schema_name()関数を使用して、msdn.microsoft.com
en

@NoDisplayNameちょうどあなたがいるのででき、あなたがいることを意味するものではありませんはず ... blogs.sqlsentry.com/aaronbertrand/...
アーロン・ベルトラン

@AaronBertrand-私の悪い考えはそれがより良い方法であるかもしれないと思いました。指摘してくれてありがとう。
Pரதீப்14年

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ソリューションを探しているときにこの質問を見つけたので、ここで答えの1つを読んだ後に思いついたソリューションを共有します。
OMA

7

最も簡単な方法は、データベース全体を削除してもう一度作成することです。

drop database db_name
create database db_name

それで全部です。


1
:)少なくとも私にとって、すべてのテーブルを削除する目的は、データベースを削除できないためです
Hasan Zafari

5
このコマンドを会社のデータベースで実行しないでください。または別の仕事を見つける準備ができています。
ファラス

@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

クエリは1つではありませんが、非常に短くて魅力的です。

-- 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データベースで私のために働きました!


1

私はこの質問が非常に古いことを知っていますが、このコードが必要になるたびに..ところで、テーブルとビュー、関数と手順がある場合、このスクリプトですべて削除できます..なぜこのスクリプトを投稿するのですか?uがすべてのテーブルを削除する場合、すべてのビューを削除する必要があり、FunctionsとPROCEDURESがある場合も削除する必要
があるので、誰かの助けになることを願っています

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.