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

36 浏览
0 Comments

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

我有一个数据库的测试环境,我想在测试循环的开始重新加载新数据。我不想重建整个数据库,只是简单地“重新设置”数据。

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

admin 更改状态以发布 2023年5月20日
0
0 Comments

对于SQL 2005,

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

还有一些链接用于20002005/2008

0
0 Comments

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

-- 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指出禁用约束不允许使用截断,必须删除约束,然后重新创建

0