2011-12-09 104 views
99

我想寫一個腳本,將完全清空SQL Server數據庫。這是我到目前爲止有:如何刪除SQL Server數據庫中的所有表?

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

當我在Management Studio中運行它,我得到:

Command(s) completed successfully.

但是當我刷新表列表中,他們都還在那裏。我究竟做錯了什麼?

+0

刪除?將從表中刪除記錄。您應該使用DROP TABLE?,但是由於其他原因不起作用。 – datagod

+0

如果這個頁面上的解決方案都沒有工作,也許你忘了:USE [DatabaseName] GO –

回答

168

當我有多個外鍵表時,它不適用於我。
我發現代碼工作,並做一切嘗試(刪除數據庫中的所有表):

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 

你可以找到後here。這是Groker的帖子。

+0

爲什麼當您嘗試使用BEGIN-END代碼塊在IF語句中包裝整段代碼時,它會抱怨光標? – Adam

+5

我收到錯誤'無法找到存儲過程'sp_MSForEachTable'。' – Korayem

+0

然後,您可以手動循環遍歷所有表。見哈帕爾的回答。 –

29

delete用於刪除表中的行。您應該改用drop table

EXEC sp_msforeachtable 'drop table [?]' 
+0

這似乎已經解決了沒有任何錯誤的問題,但現在我遇到了約束錯誤。我的'NOCHECK CONSTRAINT'行的語法錯了嗎? – dixuji

+1

我用FK的快速2桌上使用它,它的工作。 EXEC sp_msforeachtable'ALTER TABLE? NOCHECK CONSTRAINT全部' – DaveShaw

+5

這隻適用於我刪除方括號後的工作:EXEC sp_msforeachtable'drop table?'。 – LPains

19
/* 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 
+0

在SQL Azure中工作:) sp_MSforeachtable在那裏不起作用 –

+0

請注意,如果您有非dbo架構(例如,如果您使用的是Hangfire),則此操作將失敗 –

11

您是差不多吧,請改用:

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. 

意味着所有t能夠被成功刪除。

+0

這對我有效,謝謝。 – Ciwan

155

您也可以使用MSSMS工具(不使用sql)從數據庫中刪除所有表。有時候,這種方式可以更舒服(尤其是如果是偶爾進行的話)

我一步做到這一步如下:

  1. 選擇在數據庫樹「表」(對象資源管理器)
  2. 新聞F7打開對象資源管理器詳細信息視圖
  3. 在這個視圖,其(它們都在這種情況下)都選擇將被刪除的表
  4. 按Delete鍵,直到所有的表被刪除(你重複多次,由於誤差的大小到關鍵約束/依賴關係)
+3

我無法使用sp_msforeachtable在Azure sql數據庫上工作。我猜他們不包括Azure。此解決方案效果出色,並且在使用EF遷移進行模擬或進行大量更改(重新開始)時非常完美。 – trevorc

+0

不考慮FK /訂單。 – Josh

+1

這是一個方便的方法,如果你只是需要在這裏和那裏做,腳本可能會更好,如果你經常這樣做。 –

2

如何刪除整個數據庫,然後再次創建它?這對我有用。

DROP DATABASE mydb; 
CREATE DATABASE mydb; 
+0

你不需要在兩者之間爆炸mdf&ldf文件嗎? – ruffin

+0

我正在使用Web主機提供商,我對此不太確定。我想這些文件將在您刪除數據庫時自動刪除,除非您處於脫機狀態。 –

+2

因爲數據庫可能有存儲過程,特殊配置等。 – Dendory

5

似乎命令應該是不加方毯

EXEC sp_msforeachtable 'drop table ?' 
8

簡短而親切:

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_MSforeachtable'替換'sp_msforeachtable',並強烈建議添加'use yourdatabase'作爲第一行。 工作就像一個魅力。 –

+0

這工作得很好......謝謝! – daniness

2

禁食的方法是:

  1. 新數據庫圖表
  2. 添加所有的表
  3. 按Ctrl + A全選
  4. 右鍵點擊
  5. 按Ctrl + S 「從數據庫中刪除」 保存
  6. 享受
4

接受的答案不支持Azure上。它使用未記錄的存儲過程「sp_MSforeachtable」。如果您在運行時遇到「azure無法找到存儲過程sp_msforeachtable」錯誤,或者只是想避免依賴未記錄的功能(可以刪除或在任何時候更改其功能),請嘗試下面的內容。

此版本忽略實體框架遷移歷史記錄表「__MigrationHistory」和「database_firewall_rules」,這是Azure表,您將無權刪除。

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

+0

作爲蔚藍的魔法工作。通過VS的用戶界面移除速度要快得多 –

0

我知道這是現在一個老的文章,但我已經嘗試了所有的答案就在這裏上的數據庫衆多,我發現他們都有時會工作,但並非所有時間都適合各種各樣的(我只能假設)SQL Server怪癖。

最終我想出了這個。我在任何地方(一般來說)都測試了它,我可以並且它可以工作(沒有任何隱藏的存儲過程)。

對於筆記主要是關於SQL Server 2014.(但我試過的大多數其他版本似乎也工作正常)。

我試過while循環和空等等等等,遊標和各種其他形式,但他們總是似乎失敗了一些數據庫,但沒有其他原因沒有明顯的原因。

獲得一個計數並使用它進行迭代總是似乎在我測試過的所有東西上都能正常工作。

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

對於我來說,最簡單的方法:

--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 ?' 
相關問題