如何以任何方式执行此查询:
delete from sys.tables where is_ms_shipped = 0
发生的事情是,我执行了一个非常大的查询,我忘记USE
在它上面放置指令,现在我的主数据库上有无数的表,不想一个一个地删除它们。
更新:这是一个全新的数据库,所以我不必关心任何以前的数据,我想要达到的最终结果是将主数据库重置为出厂发货。
如何以任何方式执行此查询:
delete from sys.tables where is_ms_shipped = 0
发生的事情是,我执行了一个非常大的查询,我忘记USE
在它上面放置指令,现在我的主数据库上有无数的表,不想一个一个地删除它们。
更新:这是一个全新的数据库,所以我不必关心任何以前的数据,我想要达到的最终结果是将主数据库重置为出厂发货。
如果这是一次性问题,请使用 SQL Server Management Studio 删除表。
如果您必须非常非常小心地运行脚本,请使用以下命令:
EXEC sp_msforeachtable 'DROP TABLE ?'
我过去使用的一种非常简单且相对简单的方法是查询系统表/信息模式(取决于确切的要求)并让它输出我想要执行的命令列表作为结果集。回顾一下,复制和粘贴,运行 - 一次性工作快速简单,并且因为您仍然手动点击破坏性位上的按钮,所以(恕我直言)更难错误地丢弃东西。
例如:
select 'drop table ' + name + ';', * from sys.tables where is_ms_shipped = 0
没有备份?:-)
一种方法可能是使用初始数据库导入在 Visual Studio 中创建数据库项目。然后删除表并将项目同步回数据库。您可以使用这种方法进行大量删除,同时使用提交阶段和 UI 进行“缓冲”。
我相当肯定上述方法也可以用来处理表关系(尽管我没有在“主”空间中尝试过)。我还建议使用 VS DB 项目(或其他允许模式比较和同步的数据库管理工具)以使未来的生活更轻松,并允许版本化(例如,使用 SCM)模式更改跟踪。
哦,不管做什么,请先创建一个备份。如果不出意外,这是很好的培训:-)
我做的最简单和最短的方法是:
这里所有其他答案的问题是它不起作用,因为有相关的表并且它拒绝执行。
这一个,不仅有效,而且实际上是我正在寻找的:“重置为出厂默认设置”,如问题中所述。
这也将删除所有内容,而不仅仅是表格。
这段代码可能会更好,但我在编写它时尽量保持谨慎。我认为在您承诺删除表之前,很容易遵循易于调整的测试。
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
我做了一些非常相似的事情,我最终做的是使用 Tasks--> 脚本数据库来仅为最初预期数据库的所有数据库对象编写脚本。这意味着我应该在其上运行巨型脚本的数据库,而我确实在其上运行过它。确保在高级选项中包含 IF Exists,然后针对 master 和 BAM 运行该脚本,删除存在于原始目标数据库中的所有内容,也存在于 master 中,留下差异,这应该是原始主项。
不是很优雅,但因为这是一次性任务。
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)