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

我不想input所有表格的名字来删除所有的表格。 一个查询可能吗?

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

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 

Sys.Tables版本

 SELECT ' 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 

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

 EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

欲了解更多信息, 请点击这里

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

 EXEC sp_MSforeachtable @command1 = "DROP TABLE ?" 

这是一个隐藏在SQL Server中的存储过程,并将为您连接的数据库中的每个表执行。

注意:在运行上面的查询之前,首先检查是否有与任何表的外键关系。 如果你有,那么通过运行这个查询来禁用外键约束

 EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

如果您不想input,则可以使用以下命令创build语句:

 USE Databasename SELECT 'DROP TABLE [' + name + '];' FROM sys.tables 

然后复制并粘贴到一个新的SSMS窗口来运行它。

我只是对@ NoDisplayName的答案作一个小的改动,并在TABLE_NAME列上使用QUOTENAME() ,并且还包括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; 

或者使用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; 

如果其他人有最佳答案的解决scheme(包括禁用外键)的问题,这里是我的另一个解决scheme

 -- 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' 

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

 SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA = 'your_database_name' 

使用以下脚本drop所有constraints

 DECLARE @sql NVARCHAR(max)='' SELECT @sql += ' ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + ' NOCHECK CONSTRAINT all; ' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' Exec Sp_executesql @sql 

然后运行以下命令删除所有表:

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

这对我在Azure SQL数据库中'sp_msforeachtable'不可用的工作!

不完全是一个查询,仍然相当短暂和甜蜜:

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

最快的方法是删除并重新创build整个数据库。 您可以在SQL Management Studio中单击此脚本:

  1. 在对象资源pipe理器中右键单击数据库
  2. select“脚本数据库”
  3. select“拖放并创build到”
  4. select首选目标(新查询窗口,文件等)