【问题标题】:Delete all tables in SQL Server database except few删除 SQL Server 数据库中除少数之外的所有表
【发布时间】:2016-08-02 12:15:35
【问题描述】:

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

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

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

认为它可能会起作用。但正如我所料,它会引发错误

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

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

【问题讨论】:

  • 测试和开发站点?有一个脚本来重新创建数据库。需要时重新开始。
  • 您可以编写一个游标来遍历 sys.tables,在其中构建 drop table 语句并执行它们。

标签: sql sql-server database sql-server-2008


【解决方案1】:

您可以使用动态查询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)

【讨论】:

  • 必须将变量声明为NVARCHAR,因为表名可能包含Unicode 字符。您应该使@ExecSQL 的长度为(MAX),因为您不知道表的数量(因此是SQL 的长度)。您应该使用两个部分名称QUOTENAME(schema) + '.' + QUOTENAME(name),因为表可能属于不同的模式。而且您必须通过正确的名称引用系统表和列,包括大小写,您的示例将在区分大小写的排序规则数据库上失败。
  • @RemusRusanu:感谢您的通知。上述几点已更正。
  • 针对此类问题的简单干净模板。谢谢
【解决方案2】:
            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';

【讨论】:

    【解决方案3】:
    1. 通过单击选择表格
    2. 按下删除按钮并回车。 注意:如果有任何依赖(外键),表不会被删除

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 1970-01-01
      • 2014-08-24
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多