我试图写一个脚本,将完全清空SQL Server数据库。这是我目前所拥有的:

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

当我在管理工作室运行它时,我得到:

命令执行成功。

但当我刷新表列表时,它们都还在那里。我做错了什么?


当前回答

已接受的答案不支持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/

其他回答

如果删除整个数据库,然后重新创建它呢?这对我很有用。

DROP DATABASE mydb;
CREATE DATABASE mydb;

对于时态表来说,由于可能会有一些外键和例外,这有点复杂:

在表XXX上执行删除表操作失败,因为在系统版本的时态表上不支持该操作

你可以使用的是:

-- Disable constraints (foreign keys)
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Disable system versioning (temporial tables)
EXEC sp_MSForEachTable '
 IF OBJECTPROPERTY(object_id(''?''), ''TableTemporalType'') = 2
  ALTER TABLE ? SET (SYSTEM_VERSIONING = OFF)
'
GO

-- Removing tables
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO

Delete用于从表中删除行。你应该用drop table代替。

EXEC sp_msforeachtable 'drop table [?]'

您也可以只使用MSSMS UI工具(不使用SQL脚本)从数据库中删除所有表。有时这种方式会更舒服(尤其是偶尔这样做的时候)

我是这样一步一步做的:

在数据库树中选择“Tables”(对象资源管理器) 按F7打开对象资源管理器详细信息视图 在这个视图中选择必须删除的表(在本例中是所有表) 一直按Delete键,直到所有表都被删除(重复该操作的次数与由于键约束/依赖导致的错误数量相同)

在地对地导弹:

右键单击数据库 转到“任务” 点击“生成脚本” 在“选择对象”部分,选择“脚本整个数据库和所有数据库对象” 在“设置脚本选项”部分,单击“高级”按钮 在“脚本删除和创建”上切换“脚本创建”到“脚本删除”并按“确定” 然后,保存到文件,剪贴板,或新的查询窗口。 运行脚本。

现在,这将删除所有内容,包括数据库。确保删除您不希望删除的项目的代码。或者,在“选择对象”部分,而不是选择脚本整个数据库,只是选择你想要删除的项目。