从架构中删除除 SQL 中的特定表之外的所有表?

Remove all tables from schema except specific ones in SQL?

我有一个 SQL 数据库,我想删除几乎所有与特定模式相关的表,除了其中几个。因此我认为我需要编辑以下 sql 查询(删除特定模式的所有表):

EXEC sp_MSforeachtable
@command1 = 'DROP TABLE ?'
, @whereand = 'AND SCHEMA_NAME(schema_id) = ''your_schema_name'' '

您能否建议一种巧妙而优雅的方法,以便我可以添加我想保留的表格列表并删除其他所有内容?

如果您想继续使用 sp_msforeachtable,请传入一组 table 的名称以继续使用临时 table。下面是一个使用 boo 架构的示例:


create schema boo;
create table boo.t(i int);

create table #keep (name sysname); 
insert #keep values ('myFirsttable'), ('mySecondTable'), ('myThirdTable');

exec sp_msforeachtable 
   @command1='drop table ?; print ''dropped ?''',
   @whereand = 'and schema_name(schema_id) = ''your_schema_name'' and object_name(object_id) not in (select name from #keep)';

但就个人而言,我可能只会编写自己的带有游标的存储过程。更难搞砸了。

请注意,此解决方案要求您将要 保持 的 table 放入临时 table。 Charlieface 的解决方案希望您将要 drop 的 table 的名称放入 table 变量中。

您可以将要删除的 table 列表存储在 table 变量或 Table 值参数 @tables 中,然后您可以简单地执行动态SQL用它。

DECLARE @tables TABLE (tablename sysname);
INSERT @tables (tablename)
SELECT t.name
FROM sys.tables t
WHERE t.schema_id = SCHEMA_ID('your_schema_name');

DECLARE @sql nvarchar(max) =
(
    SELECT STRING_AGG(CAST(
        'DROP TABLE ' + QUOTENAME('your_schema_name') + '.' + QUOTENAME(tablename) + ';'
      AS nvarchar(max)), '
'   )
    FROM @tables
);

EXEC sp_executesql @sql;

或者,select 它直接来自 sys.tables

DECLARE @sql nvarchar(max) =
(
    SELECT STRING_AGG(CAST(
        'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + '.' + QUOTENAME(t.name) + ';'
      AS nvarchar(max)), '
'   )
    FROM sys.tables t
    WHERE t.schema_id = SCHEMA_ID('your_schema_name')
);

EXEC sp_executesql @sql;