如何以任何方式执行此查询:
delete from sys.tables where is_ms_shipped = 0
发生的事情是,我执行了一个非常大的查询,我忘了将USE
指令放在它上面,现在我的主数据库上有一个数以亿计的表,并且不想删除它们之一。
更新:这是一个全新的数据库,所以我不必关心以前的任何数据,我想要实现的最终结果是将主数据库重置为工厂出货。
答案 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>