2011-12-09 78 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 ?' 
相关问题