如何使用TSQL截断数据库中的所有表?
如何使用TSQL截断数据库中的所有表?
我有一个数据库的测试环境,我想在测试循环的开始重新加载新数据。我不想重建整个数据库,只是简单地“重新设置”数据。
使用TSQL从所有表中删除所有数据的最佳方法是什么?是否可以使用系统存储过程、视图等?我不想为每个表手动创建和维护truncate table语句,我希望它是动态的。
admin 更改状态以发布 2023年5月20日
当处理具有外键关系的表中的数据删除时 - 这基本上是任何合理设计的数据库的情况 - 我们可以禁用所有约束,删除所有数据,然后重新启用约束
-- 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)
当前标识值设置为新的重新播种值。
如果自创建表以来没有向表中插入任何行,
DBCC CHECKIDENT 执行后第一行插入将使用 newReseedValue 作为标识。
否则,下一个插入的行将使用 newReseedValue + 1。
如果 newReseedValue 小于标识列中的最大值,则在后续对表的引用中生成错误消息 2627。
感谢Robert指出禁用约束不允许使用截断,必须删除约束,然后重新创建