从架构中删除除 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;
我有一个 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;