在 SQL Server 数据库中删除除少数表之外的所有表

7

我有大约50多个表在我的数据库中,现在我想删除除少数表之外的所有表。

现在我知道的是sys.tables是一个列出所有表的表,所以我最初运行了这样的查询

delete from sys.tables where name like '%DynamicSurgery' (or any other condition)

我以为这可能起作用。但正如我所预料的那样,它抛出了一个错误,如下:

不允许对系统目录进行临时更新。

请告诉我有没有办法在SQL Server中删除多个?


1
测试和开发网站?有一个重新创建数据库的脚本。需要时从头开始。 - jarlh
1
你可以编写一个游标来遍历 sys.tables,其中你可以构建“drop table”语句并执行它们。 - HoneyBadger
3个回答

15
您可以使用动态查询来DROP所需表:
DECLARE @ExecSQL AS NVARCHAR (MAX) = '';

SELECT @ExecSQL = @ExecSQL + 
    'DROP TABLE ' + QUOTENAME(S.name) + '.' + QUOTENAME(T.name) + '; ' 
FROM sys.tables T
JOIN sys.schemas S ON S.schema_id = T.schema_id
WHERE T.name LIKE '%DynamicSurgery'

--PRINT @ExecSQL
EXEC (@ExecSQL)

7
由于表名可能包含Unicode字符,您必须将变量声明为“NVARCHAR”。 您应该使@ExecSQL长度为(MAX),因为您不知道表的数量(因此也不知道SQL语句的长度)。 您应该使用2部分名称QUOTENAME(schema) + '.' + QUOTENAME(name),因为表可能属于不同的架构。 并且您必须按它们正确的名称引用系统表和列,包括大小写,否则在区分大小写的比较数据库上,您的示例将失败。 - Remus Rusanu
1
@RemusRusanu:感谢您的通知。已经纠正了所述的问题。 - Arulkumar
1
很棒的简单干净的模板,适用于这种类型的问题。谢谢。 - glenn garson

0
            EXEC sys.sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';

            EXEC sp_MSforeachtable 'IF OBJECT_ID(''?'') NOT IN (
                  ISNULL(OBJECT_ID(''[dbo].[Table1]''),0),
                  ISNULL(OBJECT_ID(''[dbo].[Table2]''),0)
                  )
            DELETE FROM ?';

            EXEC sys.sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL';

-6
  1. 点击表格以选择它
  2. 按下删除按钮并按回车键。 请注意:如果存在任何依赖关系(外键),则无法删除该表格

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接