我有一个数据库的测试环境,我想在测试周期开始时用新数据重新加载该数据库。我对重建整个数据库不感兴趣——只是简单地“重新设置”数据。
使用TSQL从所有表中删除所有数据的最佳方法是什么?是否有可以使用的系统存储过程、视图等?我不想为每个表手动创建和维护截断表语句-我更希望它是动态的。
我有一个数据库的测试环境,我想在测试周期开始时用新数据重新加载该数据库。我对重建整个数据库不感兴趣——只是简单地“重新设置”数据。
使用TSQL从所有表中删除所有数据的最佳方法是什么?是否有可以使用的系统存储过程、视图等?我不想为每个表手动创建和维护截断表语句-我更希望它是动态的。
当前回答
制作一个空的“模板”数据库,进行完全备份。当您需要刷新时,只需使用WITH REPLACE恢复。快速,简单,防弹。如果这里或那里的几个表需要一些基本数据(例如。配置信息,或让你的应用程序运行的基本信息),它也会处理这些。
其他回答
制作一个空的“模板”数据库,进行完全备份。当您需要刷新时,只需使用WITH REPLACE恢复。快速,简单,防弹。如果这里或那里的几个表需要一些基本数据(例如。配置信息,或让你的应用程序运行的基本信息),它也会处理这些。
我喜欢在MSSQL Server developer或Enterprise中使用的另一个选项是在创建空模式后立即创建数据库快照。此时,您可以继续将数据库恢复到快照。
当处理从具有外键关系的表中删除数据时(这基本上是任何设计良好的数据库的情况),我们可以禁用所有约束,删除所有数据,然后重新启用约束
-- 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指出禁用约束不允许使用截断的事实,约束必须被删除,然后重新创建
虽然有点晚了,但也许能帮到别人。 我有时会创建一个过程,使用T-SQL执行以下操作:
将所有约束存储在临时表中 删除所有约束 除某些不需要截断的表外,截断所有表 重新创建所有约束。
我已经把它列在我的博客上了
最简单的方法就是
打开SQL Management Studio 导航到数据库 右键单击并选择任务->生成脚本(pic 1) 在“选择对象”界面,选择“选择特定对象”选项并勾选“表格”(图2) 在下一个屏幕上,选择“高级”,然后将“Script DROP and CREATE”选项更改为“Script DROP and CREATE”(图3) 选择将脚本保存到新的编辑器窗口或文件中,并根据需要运行。
这将为您提供一个删除和重新创建所有表的脚本,而无需担心调试或是否包含了所有内容。虽然这不仅仅执行截断,但结果是相同的。请记住,自动递增的主键将从0开始,而截断的表将记住最后分配的值。如果在PreProd或Production环境中无法访问Management studio,也可以从代码中执行此操作。
1.
2.
3.