私は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による投稿です。
MSSMSツールのみを使用して(sqlを使用せずに)データベースからすべてのテーブルを削除することもできます。時々この方法はより快適になることがあります(それが時折実行される場合特に)
私は次のように段階的にこのステップを行います:
delete
は、テーブルから行を削除するために使用されます。代わりにdrop table
を使用してください。
EXEC sp_msforeachtable 'drop table [?]'
/* 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
SSMSの場合:
これで、データベースを含むすべてが削除されます。ドロップしたくないアイテムのコードは必ず削除してください。あるいは、[オブジェクトの選択]セクションで、データベース全体をスクリプト化するのではなく、削除するアイテムを選択するだけです。
あなたはほとんど正しいです、代わりに使ってください:
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.
すべてのテーブルが正常に削除されたことを意味します。
短くて甘い:
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
受け入れられた答えは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/
コマンドは四角いブランケットなしであるべきだと思われる
EXEC sp_msforeachtable 'drop table ?'
私にとっては、最も簡単な方法:
--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 ?'
最速の方法は次のとおりです。
データベース全体を削除してから再度作成するのはどうですか。これは私のために働きます。
DROP DATABASE mydb;
CREATE DATABASE mydb;
私はこれが古い投稿であることを今知っていますが、私はここで多数のデータベースですべての答えを試してみました、そしてそれらはすべて時々はたらくのを発見しました。
結局私はこれを思い付きました。私はこれを至る所でテストしました(一般的に言えば)ことができ、それは(どんな隠れたストアプロシージャもなしで)うまくいきます。
主に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
すべてのテーブルを削除するしたい場合は、データベースを削除してから新しいデータベースを作成することもできます。
T-SQL:
ドロップデータベース
GO
データベースを作成する
GO
これを達成するためにSQL Management Studio(SSMS、私の場合はv 17.9.1):
そしてこれで終わりです!テーブルを含まない新しいデータベースがあります。このアプローチの利点は、制約を気にする必要がなく、テーブルの削除を禁止したり、従属ビューやSPが機能しなくなったり、動的SQLスクリプトが不要になることです。バックアップを取っていれば、後でそれらを追加することができます。
覚えている to バックアップあなたのデータベース以前あなたはそれをします!いくつかのSPまたはビューが必要な場合は、データベースを再作成する前にそれらをスクリプトとして保存し、それらが新しいテーブルで機能するように編集して後で追加します。