【问题标题】:How to programmatically clear all tables from all databases in Microsoft SQL Server如何以编程方式清除 Microsoft SQL Server 中所有数据库中的所有表
【发布时间】:2020-02-25 16:41:42
【问题描述】:

我发现这个脚本可以清除一个数据库中的所有表。

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO

我不熟悉 Microsoft SQL Server,目前我右键单击并运行查询。我有 100 个数据库要清理。

如何以编程方式清除所有数据库中的所有表?

【问题讨论】:

  • “清除”所有表格是什么意思?删除所有数据?考虑到您应该有外键,这不是一项简单的任务。
  • 老实说,如果您确实需要“干净”的数据库,最好DROP 然后从源代码管理中重新创建它们吗?
  • 如果您需要清空一个实例上超过 100 个数据库的每个表中的数据,那就大错特错了。这是一个巨大的危险信号,您需要认真考虑重写您的大部分系统,或者您正试图破解某人。无论哪种方式,你试图完成的事情听起来都非常错误,甚至都不好笑。
  • 将所有数据库提交到 git - 全部删除并通过 git 部署

标签: sql-server


【解决方案1】:

您也可以使用未记录的sp_MSForEachDB,将它与sp_MSForEachTable 结合起来遍历每个db,然后遍历每个表。您应该使用TRUNCATE 而不是DELETE。但是,最好只使用 SSMS 为数据库生成脚本。生成脚本,删除旧数据库,生成一个新的空数据库。

这个未记录的过程的语法是:

EXEC sp_MSforeachdb @command

例子:

USE master
GO

EXEC sys.sp_MSforeachdb 'USE ?
IF DB_NAME() NOT IN(''master'', ''model'', ''msdb'', ''tempdb'')
BEGIN
    EXEC sp_MSForEachTable ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'';
    EXEC sp_MSForEachTable ''TRUNCATE ?'';
    EXEC sp_MSForEachTable ''ALTER TABLE ? CHECK CONSTRAINT ALL'';
END'
GO  

【讨论】:

  • 我正在右键单击数据库放置并创建到。当我运行脚本时,它需要 10 多分钟才能重新创建一个数据库。而上面的脚本是即时的。
  • 就个人而言,在这种情况下,我更喜欢截断而不是删除,但删除并重新创建数据库对我来说仍然是最有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2010-11-15
相关资源
最近更新 更多