6

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

delete from sys.tables where is_ms_shipped = 0

发生的事情是,我执行了一个非常大的查询,我忘记USE在它上面放置指令,现在我的主数据库上有无数的表,不想一个一个地删除它们。

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

4

7 回答 7

7

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

如果您必须非常非常小心地运行脚本,请使用以下命令:

EXEC sp_msforeachtable 'DROP TABLE ?'
于 2011-01-10T01:35:15.407 回答
3

我过去使用的一种非常简单且相对简单的方法是查询系统表/信息模式(取决于确切的要求)并让它输出我想要执行的命令列表作为结果集。回顾一下,复制和粘贴,运行 - 一次性工作快速简单,并且因为您仍然手动点击破坏性位上的按钮,所以(恕我直言)更难错误地丢弃东西。

例如:

select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0
于 2011-01-10T12:25:26.050 回答
2

没有备份?:-)

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

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

哦,不管做什么,请先创建一个备份。如果不出意外,这是很好的培训:-)

于 2011-01-10T02:53:05.177 回答
1

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

如何在 SQL Server 2008 中重建系统数据库

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

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

于 2011-01-10T03:48:49.840 回答
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
于 2011-11-01T12:32:40.333 回答
1

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

于 2011-12-28T15:16:02.583 回答
0

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

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)
于 2011-01-10T02:55:55.117 回答