如何从db中删除所有表?无法从sys.tables中删除

时间:2011-01-10 01:32:57

标签: sql-server sql-server-2008 adhoc sys sql-server-2008r2-express

如何以任何方式执行此查询:

delete from sys.tables where is_ms_shipped = 0

发生的事情是,我执行了一个非常大的查询,我忘了将USE指令放在它上面,现在我的主数据库上有一个数以亿计的表,并且不想删除它们之一。

更新:这是一个全新的数据库,所以我不必关心以前的任何数据,我想要实现的最终结果是将主数据库重置为工厂出货。

7 个答案:

答案 0 :(得分:7)

如果这是一次性问题,请使用SQL Server Management Studio删除表。

如果您必须运行脚本非常非常,请小心使用:

EXEC sp_msforeachtable 'DROP TABLE ?'

答案 1 :(得分:3)

我过去使用的一种非常简单且相对简单的方法是查询系统表/信息模式(取决于具体要求)并让它输出我想要执行的命令列表作为结果集。复习,复制&粘贴,运行 - 快速&很容易一次性工作,因为你仍然手动按下破坏性位上的按钮,它(恕我直言)更难以误删垃圾。

例如:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0

答案 2 :(得分:2)

没有备份? : - )

一种方法可能是在Visual Studio中使用初始数据库导入创建数据库项目。然后删除表并将项目同步回数据库。您可以使用此方法进行删除,同时使用提交阶段和UI进行“缓冲”。

相当确定上述方法也可以用来处理表关系(虽然我在“主”空间中未尝试)。我还建议使用VS DB项目(或允许模式比较和同步的其他数据库管理工具),以便将来更轻松,并允许版本化(例如使用SCM)架构更改跟踪。

哦,无论做什么,请先创建一个备份。如果没有别的,这是很好的训练: - )

答案 3 :(得分:1)

不是很优雅,但因为这是一次性任务。

WHILE EXISTS(SELECT * FROM sys.tables where is_ms_shipped = 0) 
      EXEC sp_MSforeachtable 'DROP TABLE ?'

在这个简单的测试中正常工作(在第一次尝试失败后继续第二次循环a并继续前进以删除b

create table a
(
a int primary key
)
go

create table b
(
a int references a (a)
)

insert into a values (1)

insert into b values (1)

答案 4 :(得分:1)

我做的最简单和最短的方式是:

How to Rebuild System Databases in SQL Server 2008

这里所有其他答案的问题是它不起作用,因为有相关的表而且它拒绝执行。

这个,它不仅有效,而且实际上是我正在寻找的:“重置为出厂默认值”,如问题中所述。
此外,这将删除所有内容,而不仅仅是表格。

答案 5 :(得分:1)

这段代码可能会更好,但我在写这篇文章的过程中一直保持谨慎。我认为在你提交删除表之前,很容易跟上一个易于调整的测试。

DECLARE 
    @Prefix VARCHAR(50),
    @TableName NVARCHAR(255),
    @SQLToFire NVARCHAR(350)

SET @Prefix = 'upgrade_%'

WHILE EXISTS(
    SELECT
        name
    FROM
        sys.tables
    WHERE
        name like @Prefix
    )
BEGIN
    SELECT
        TOP 1   --This query only iterates if you are dropping tables
        @TableName = name
    FROM
        sys.tables
    WHERE
        name like @Prefix

    SET @SQLToFire = 'DROP TABLE ' + @TableName

    EXEC sp_executesql @SQLToFire;
END

答案 6 :(得分:1)

我做了一些非常相似的事情,我最后做的就是使用任务 - &gt;脚本数据库仅为原始预期数据库的所有数据库对象的脚本删除。这意味着数据库我应该运行巨型脚本,我确实运行它。确保在高级选项中包含IF Exists,然后针对master和BAM运行该脚本,删除原始目标数据库中也存在于master中的所有内容,留下差异,这些差异应该是原始主项。< / p>