我不想输入所有表的名称来删除所有表。这可能只用一个查询吗?


当前回答

使用以下脚本删除所有约束:

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'不可用!

其他回答

如果你不想输入,你可以这样创建语句:

USE Databasename

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

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

对我来说就是这样


DECLARE @cnt INT = 0;

WHILE @cnt < 10 --Change this if all tables are not dropped with one run
BEGIN
SET @cnt = @cnt + 1;
EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"
END

使用INFORMATION_SCHEMA。视图来获取表的列表。在select语句中生成Drop脚本,并使用动态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

Sys。表版本

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

注意:如果在表之间定义了任何外键,那么首先运行下面的查询来禁用数据库中存在的所有外键。

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

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

使用以下脚本删除所有约束:

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'不可用!

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

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

这是一个隐藏在sql server中的存储过程,将对连接的数据库中的每个表执行。

注意:由于依赖关系,您可能需要执行几次查询来删除所有表。

注意2:为了避免第一个注意,在运行查询之前,首先检查是否存在与任何表的外键关系。如果有,那么通过运行下面的查询禁用外键约束:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"