web-dev-qa-db-ja.com

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

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

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

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

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

しかし、テーブルリストを更新すると、それらはすべてまだそこにあります。何がおかしいのですか?

144
dixuji

複数の外部キーテーブルがあるときも私にとってはうまくいきません。
私は、あなたが試みるすべてのことを行い、実行するコードを見つけました(データベースからすべてのテーブルを削除します)。

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による投稿です。

234
Gabriel GM

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

私は次のように段階的にこのステップを行います:

  1. データベースツリーで[テーブル]を選択します(オブジェクトエクスプローラ)
  2. F7キーを押して「オブジェクト・エクスプローラーの詳細」ビューを開く
  3. このビューで、削除する必要があるテーブルを選択します(この場合、それらすべて)。
  4. すべてのテーブルが削除されるまでDeleteキーを押します(キーの制約や依存関係によるエラーの数と同じ回数だけ繰り返します)。
241
Bronek

deleteは、テーブルから行を削除するために使用されます。代わりにdrop tableを使用してください。

EXEC sp_msforeachtable 'drop table [?]'
32
DaveShaw
/* 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
23
Harpal

SSMSの場合:

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

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

17
Ben

あなたはほとんど正しいです、代わりに使ってください:

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
Michał Powaga

短くて甘い:

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
13
Richard Pierre

受け入れられた答えは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/

13
CountZero

コマンドは四角いブランケットなしであるべきだと思われる

EXEC sp_msforeachtable 'drop table ?'
4
Jimmy Wong

私にとっては、最も簡単な方法:

--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 ?'
3
Jeffrey

最速の方法は次のとおりです。

  1. すべてのテーブルを追加
  2. Ctrl + Aですべて選択
  3. 「データベースから削除」を右クリック
  4. Ctrl + Sで保存
  5. 楽しい
2
TuanDPH

データベース全体を削除してから再度作成するのはどうですか。これは私のために働きます。

DROP DATABASE mydb;
CREATE DATABASE mydb;
1
Chong Lip Phang

私はこれが古い投稿であることを今知っていますが、私はここで多数のデータベースですべての答えを試してみました、そしてそれらはすべて時々はたらくのを発見しました。

結局私はこれを思い付きました。私はこれを至る所でテストしました(一般的に言えば)ことができ、それは(どんな隠れたストアプロシージャもなしで)うまくいきます。

主にSQL Server 2014に関するメモです(ただし、私が試した他のバージョンのほとんども正常に機能しているようです)。

Whileループやnullなど、カーソルやその他のさまざまな形式を試してみましたが、明らかな理由もなく、一部のデータベースでは常に失敗するように見えますが、他のデータベースでは失敗しないようです。

カウントを取得し、それを使用して反復することは、常にIveがテストしたすべてのことに効果があるようです。

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

すべてのテーブルを削除するしたい場合は、データベースを削除してから新しいデータベースを作成することもできます。

T-SQL:

ドロップデータベース
GO
データベースを作成する
GO

これを達成するためにSQL Management Studio(SSMS、私の場合はv 17.9.1):

  1. 削除したいデータベースを右クリックします。 "北風";
    コンテキストメニューで"Delete"を選択します
  2. "Databases"(フォルダアイコン)を右クリックします。
    "New Database ..."を選択します
  3. データベース名を入力します。 "北風";
    クリックOK

そしてこれで終わりです!テーブルを含まない新しいデータベースがあります。このアプローチの利点は、制約を気にする必要がなく、テーブルの削除を禁止したり、従属ビューやSPが機能しなくなったり、動的SQLスクリプトが不要になることです。バックアップを取っていれば、後でそれらを追加することができます。

覚えている to バックアップあなたのデータベース以前あなたはそれをします!いくつかのSPまたはビューが必要な場合は、データベースを再作成する前にそれらをスクリプトとして保存し、それらが新しいテーブルで機能するように編集して後で追加します。

0
Matt