【问题标题】:How to truncate all tables of a given database in SQL Server如何在 SQL Server 中截断给定数据库的所有表
【发布时间】:2021-03-09 05:42:40
【问题描述】:

我必须在测试环境中截断三个不同测试数据库的所有表。我需要考虑表约束的 sql 查询,因为我在 AdventureWorks 数据库上测试的所有代码都引发了以下错误:

无法截断表“Person.CountryRegion”,因为它被对象“vStateProvinceCountryRegion”引用

【问题讨论】:

  • 错误告诉你问题所在。如果它们被其他对象使用,则不能TRUNCATE 表;如果你“必须”TRUNCATE 一切,你必须DROP 阻塞对象然后重新创建它们。老实说,听起来像XY Problem
  • 我尝试了以下代码gist.github.com/danguilherme/04fbe3906b46844f9351,但我无法手动列出表名。是否有截断给定数据库名称上的所有表的代码?就我而言,三个测试数据库有数百个表
  • 正如我所提到的,当存在约束和模式绑定时,您不能盲目地TRUNCATE 表。您必须先DROP ,然后再重新创建。这不是一项微不足道的任务。我个人建议从您的源代码控制/数据库项目重新部署您的数据库,因为其中不包含任何数据(除了应用程序工作可能必需的任何数据)。
  • 感谢您的回答,可惜我没有数据库项目或创建脚本
  • 那么你需要DROP阻塞对象TRUNCATE,然后在TRUNCATE完成后重新CREATEDROPed的对象。这将是一项非常手动的任务。

标签: sql-server truncate


【解决方案1】:

你可以试试这样的:

-- Disable all FK constraints...
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL";
GO

-- TRUNCATE TABLES...

-- Enable all FK constraints...
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL";
GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2015-09-19
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多