如何使用一个SQL查询从数据库中删除所有表?

Maj*_*jid 148 sql sql-server

我不想键入所有表的名称来删除所有表.是否可以使用一个查询?

Pரத*_*ீப் 153

使用INFORMATION_SCHEMA.TABLES视图获取表的列表.在select语句中生成Drop脚本并使用Dynamic SQL将其删除:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

Sys.Tables版本

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U'

Exec sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)

注意:如果foreign Keys表之间有任何定义,则首先运行以下查询以禁用foreign keys数据库中的所有存在.

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

有关更多信息,请查看此处.

  • (不是我的downvote)...我通常坚持使用`[sys]`模式视图,如果不需要跨rdbms的可移植性.http://stackoverflow.com/a/3654313/251174 (3认同)
  • 如果使用 Azure,则 sp_msforeachtable 不可用。我从@Aaron Bertrand 找到了这个甜蜜的金块来删除所有 FK 约束。这个答案真的很好用。http://dba.stackexchange.com/questions/90033/how-do-i-drop-all-constraints-from-all-tables (3认同)
  • @DoubleA - 这很简单。首先,我为数据库中的所有表构建 Drop 语句并将其存储到变量中。要检查这一点,您可以在“exec”之前使用“Print @sql”。然后通过“sp_executesql”执行动态构建的 drop 语句 (2认同)
  • 如果sp_msforeachtable不可用,您也可以多次运行delete查询,因​​为依赖于其他表的表随后将被删除:) (2认同)

Rag*_*ine 75

如果只想使用一个SQL查询来删除所有表,则可以使用它

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
Run Code Online (Sandbox Code Playgroud)

这是sql server中隐藏的存储过程,将为您连接的数据库中的每个表执行.

注意:在运行上述查询之前,首先检查是否有任何表的外键关系.如果你有,那么只需通过运行此查询来禁用外键约束

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

  • 需要注意的是,在删除所有表之前,我需要多次运行first命令,但工作正常。 (3认同)
  • @KyleVassella 是的,这只会在您打开控制台的数据库上执行 (2认同)

Dav*_*ugg 35

如果您不想键入,可以使用以下命令创建语句:

USE Databasename

SELECT  'DROP TABLE [' + name + '];'
FROM    sys.tables
Run Code Online (Sandbox Code Playgroud)

然后复制并粘贴到新的SSMS窗口中以运行它.

  • 我们还可以使用这个顺序来避免删除时的约束问题。按创建日期 desc 排序 (3认同)
  • 我们也可以使用“QUOTENAME”,它看起来很整洁。`'删除表' + QUOTENAME(名称) + ';'` (2认同)

Sup*_*ion 16

最简单的方法是删除整个数据库并再次创建它:

drop database db_name
create database db_name
Run Code Online (Sandbox Code Playgroud)

就这样。

  • 不要在公司的数据库上运行这个命令。或者准备找另一份工作。 (11认同)
  • 当心。这将清除与该表关联的所有其他系统对象,例如过程、视图等。 (6认同)
  • :) 至少对我来说删除所有表的目的是因为数据库不能被删除 (3认同)
  • @FarazDurrani 容易的人,删除所有表似乎也不是 PROD db 的交易。 (2认同)

Sil*_*hus 11

您还可以使用以下脚本删除所有内容,包括以下内容:

  • 非系统存储过程
  • 意见
  • 功能
  • 外键约束
  • 主键约束

https://michaelreichenbach.de/how-to-drop-everything-in-a-mssql-database/

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all views */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped View: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all functions */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign 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 = 'FOREIGN 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 = 'FOREIGN 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 FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN 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 = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* 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)

  • 效果很好..删除表的最佳脚本。 (2认同)

Aer*_*roX 9

我只是对@ NoDisplayName的答案进行了一些小的更改并QUOTENAME()TABLE_NAME列上使用,并且还包括TABLE_SCHEMA列包含表格不在dbo模式中.

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([TABLE_SCHEMA]) + '.' + QUOTENAME([TABLE_NAME]) + ';'
FROM [INFORMATION_SCHEMA].[TABLES]
WHERE [TABLE_TYPE] = 'BASE TABLE';

EXEC SP_EXECUTESQL @sql;
Run Code Online (Sandbox Code Playgroud)

或者使用sys模式视图(根据@ swasheck的评论):

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([S].[name]) + '.' + QUOTENAME([T].[name]) + ';'
FROM [sys].[tables] AS [T]
INNER JOIN [sys].[schemas] AS [S] ON ([T].[schema_id] = [S].[schema_id])
WHERE [T].[type] = 'U' AND [T].[is_ms_shipped] = 0;

EXEC SP_EXECUTESQL @sql;
Run Code Online (Sandbox Code Playgroud)

  • 如果不需要跨rdbms的可移植性,我通常会坚持使用`[sys]`模式视图.stackoverflow.com/a/3654313/251174 (4认同)

OMA*_*OMA 7

作为Dave.Gugg的回答的后续,这将是有人需要获取MySQL中所有DROP TABLE行的代码:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'
Run Code Online (Sandbox Code Playgroud)

  • 我知道原始海报用“sql-server”标记了这个问题,但这可能对希望在 MySQL 中执行此操作的人有用。事实上,我在谷歌搜索这个问题的 MySQL 解决方案时发现了这个问题,所以我现在分享我在阅读这里的一个答案后想出的解决方案。 (4认同)

Ani*_*Ani 5

如果有人对最佳答案的解决方案有任何疑问(包括禁用外键),这是我的另一种解决方案

-- CLEAN DB
use [DB_NAME]
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
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
EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL'
Run Code Online (Sandbox Code Playgroud)