如何使用TSQL截断数据库中的所有表?

时间:2020-03-06 14:57:00  来源:igfitidea点击:

我有一个数据库测试环境,我想在测试周期开始时重新加载新数据。我对仅通过"重置"数据来重建整个数据库不感兴趣。

使用TSQL从所有表中删除所有数据的最佳方法是什么?是否有可以使用的系统存储过程,视图等?我不想为每个表手动创建和维护截断表语句我希望它是动态的。

解决方案

这是这样做的一种方法...可能还有10个更好/更有效的方法,但是听起来这很少进行,所以这里...。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

从sysobjects中获取一个tables列表,然后用游标遍历那些表,为每个iteration调用sp_execsql('truncate table'+ @table_name)

对于SQL 2005,

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

耦合2000和2005/2008的更多链接。

仅当表之间没有任何外键关系时,才截断所有表,因为SQL Server不允许我们用外键截断表。

替代方法是先确定带有外键的表,然后再从中删除,然后再截断不带外键的表。

有关更多详细信息,请参见http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341和http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957.

当处理具有外键关系的表中的数据删除时(对于任何经过适当设计的数据库,基本上都是这种情况),我们可以禁用所有约束,删除所有数据,然后重新启用约束

-- disable all constraints
EXEC sp_MSForEachTable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- delete data in all tables
EXEC sp_MSForEachTable "DELETE FROM ?"

-- enable all constraints
exec sp_MSForEachTable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

此处更多有关禁用约束和触发器的信息

如果某些表具有标识列,我们可能希望重新设置它们的种子

EXEC sp_MSForEachTable "DBCC CHECKIDENT ( '?', RESEED, 0)"

请注意,RESEED的行为在全新表和先前已从BOL插入一些数据的表之间有所不同:

DBCC CHECKIDENT ('table_name', RESEED, newReseedValue)
  
  The current identity value is set to
  the newReseedValue. If no rows have
  been inserted to the table since it
  was created, the first row inserted
  after executing DBCC CHECKIDENT will
  use newReseedValue as the identity.
  Otherwise, the next row inserted will
  use newReseedValue + 1. If the value
  of newReseedValue is less than the
  maximum value in the identity column,
  error message 2627 will be generated
  on subsequent references to the table.

感谢Robert指出禁用禁用不允许使用截断的事实,必须先删除约束,然后重新创建

不要这样!真的,不是一个好主意。

如果知道要截断哪些表,请创建一个将其截断的存储过程。我们可以修复订单以避免外键问题。

如果我们真的想全部截断它们(例如,可以BCP加载它们),那么将很快删除数据库并从头开始创建一个新数据库,这将带来额外的好处,即我们可以确切地知道自己的位置。

我不明白为什么清除数据比删除并重新创建每个表的脚本要好。

那或者保留空数据库的备份,然后将其还原到旧数据库

我想与MSSQL Server Deveploper或者Enterprise一起使用的另一种选择是在创建空架构后立即创建数据库的快照。那时,我们可以继续将数据库还原回快照。

编写数据库脚本非常容易(甚至可能更快),然后只需从脚本中删除并创建它即可。

创建一个空的"模板"数据库,进行完整备份。当我们需要刷新时,只需使用WITH REPLACE进行还原即可。快速,简单,防弹。并且如果这里或者那里的几个表需要一些基本数据(例如配置信息,或者仅使应用运行的基本信息),它也可以处理。