如何删除SQL Server数据库中的所有表?

dix*_*uji 163 sql-server ssms sql-server-2008 sp-msforeachtable

我正在尝试编写一个完全清空SQL Server数据库的脚本.这是我到目前为止:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'
Run Code Online (Sandbox Code Playgroud)

当我在Management Studio中运行它时,我得到:

命令已成功完成.

但是当我刷新表格列表时,它们仍然存在.我究竟做错了什么?

Bro*_*nek 270

您还可以仅使用MSSMS工具(不使用sql)从数据库中删除所有表.有时这种方式可以更舒适(特别是如果偶尔进行)

我按照以下步骤逐步完成:

  1. 在数据库树上选择"Tables"(对象资源管理器)
  2. 按F7打开对象资源管理器详细信息视图
  3. 在此视图中选择必须删除的表(在本例中为所有表)
  4. 按删除直到删除所有表(由于键约束/依赖性,您重复多次作为错误数量)

  • 我无法使用sp_msforeachtable来处理Azure sql db.我猜它们不包括Azure.这种解决方案效果很好,在使用EF迁移进行模拟或进行大量更改(重新开始)时非常完美. (3认同)
  • @Josh 不考虑订单,但如果您在“删除”对话框中继续按“确定”,它将继续删除所有可以删除的表,最终将删除所有表。 (3认同)
  • 如果您只需要在这里或那里执行此操作,这是一个方便的方法,如果您经常执行此操作,脚本可能会更好。 (2认同)

Gab*_* GM 263

当有多个外键表时,它对我不起作用.
我发现代码可以正常运行并执行您尝试的所有操作(删除数据库中的所有表):

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
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到帖子.这是格罗克的帖子.

  • 我收到错误`无法找到存储过程'sp_MSForEachTable' (11认同)
  • `sp_MSforeachtable`在Azure中不可用.请改用@ CountZero的答案. (5认同)
  • 在Web上(不是我的)找到此参考:用于Azure的sp_MSforeachtable存储过程的副本,使用sp_MSforeach_worker:https://gist.github.com/metaskills/893599。 (3认同)
  • 如果您在与`dbo`不同的模式中使用表(带约束),则此答案不起作用.如果你有自定义模式,你需要将`sql`改为:`SELECT DISTINCT sql ='ALTER TABLE ['+ tc2.CONSTRAINT_SCHEMA +'].['+ tc2.TABLE_NAME +'] DROP ['+ rc1.CONSTRAINT_NAME +']'` (2认同)

Dav*_*haw 32

delete用于从表中删除行.你应该使用drop table.

EXEC sp_msforeachtable 'drop table [?]'
Run Code Online (Sandbox Code Playgroud)

  • 这在我删除方括号后才对我有用:EXEC sp_msforeachtable'drop table?'. (10认同)

小智 26

/* 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
Run Code Online (Sandbox Code Playgroud)

  • 在 SQL Azure 中工作:) sp_MSforeachtable 在那里不起作用 (2认同)

Ben*_*Ben 26

在SSMS中:

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

现在,这将删除所有内容,包括数据库.确保删除不想丢弃的项目的代码.或者,在"选择对象"部分中,不要选择脚本整个数据库,只需选择要删除的项目.

  • 这是最简单的方法。 (6认同)
  • 这应该是肯定的答案! (6认同)
  • 如果您不想删除数据库(在我的情况下不是这样,那么我需要拨打支持电话以创建数据库),请使用“选择特定的数据库对象”并选择所有您确实希望放弃。 (3认同)

Mic*_*aga 18

你几乎是对的,改为使用:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'
Run Code Online (Sandbox Code Playgroud)

但是第二行你可能需要再执行一次,直到你不再收到错误为止:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.
Run Code Online (Sandbox Code Playgroud)

信息:

Command(s) completed successfully.
Run Code Online (Sandbox Code Playgroud)

表示已成功删除所有表.


Cou*_*ero 16

接受的答案不支持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
Run Code Online (Sandbox Code Playgroud)

取自:

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/

  • 如果有任何View,它就会进入不定式循环。您必须再添加一项条件:AND TABLE_TYPE != 'VIEW' (3认同)
  • 曾在天青魔法般的作用。然后比通过VS的UI删除快得多 (2认同)

xx1*_*1xx 15

短而甜蜜:

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
Run Code Online (Sandbox Code Playgroud)

  • 我不得不用`sp_MSforeachtable`替换`sp_msforeachtable`,强烈建议添加`use yourdatabase`作为第一行.工作就像一个魅力. (2认同)

小智 8

似乎命令应该没有方形毯子

EXEC sp_msforeachtable 'drop table ?'
Run Code Online (Sandbox Code Playgroud)


Tua*_*DPH 8

禁食的方法是:

  1. 新的数据库图表
  2. 添加所有表
  3. Ctrl + A 全选
  4. 右键单击“从数据库中删除”
  5. Ctrl + S 保存
  6. 享受


小智 6

对我来说,最简单的方法:

--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 ?'
Run Code Online (Sandbox Code Playgroud)


Gaj*_*rni 6

发现!!

您可以使用以下查询从数据库中删除所有表

EXEC sp_MSforeachtable @command1 = "删除表?"

快乐编码!