我有一个数据库的测试环境,我想在测试周期开始时用新数据重新加载该数据库。我对重建整个数据库不感兴趣——只是简单地“重新设置”数据。
使用TSQL从所有表中删除所有数据的最佳方法是什么?是否有可以使用的系统存储过程、视图等?我不想为每个表手动创建和维护截断表语句-我更希望它是动态的。
我有一个数据库的测试环境,我想在测试周期开始时用新数据重新加载该数据库。我对重建整个数据库不感兴趣——只是简单地“重新设置”数据。
使用TSQL从所有表中删除所有数据的最佳方法是什么?是否有可以使用的系统存储过程、视图等?我不想为每个表手动创建和维护截断表语句-我更希望它是动态的。
当前回答
select 'delete from ' +TABLE_NAME from INFORMATION_SCHEMATABLE_TYPE='BASE TABLE'的表
结果就在那里。
在查询窗口复制粘贴并运行命令
其他回答
在截断表之前,必须删除所有外键。使用此脚本生成最终脚本,以删除和重新创建数据库中的所有外键。请将@action变量设置为“CREATE”或“DROP”。
这是数据库擦除脚本之王。它将清除所有表并正确地重新播种:
SET QUOTED_IDENTIFIER ON;
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? DISABLE TRIGGER ALL'
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; DELETE FROM ?'
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON; ALTER TABLE ? ENABLE TRIGGER ALL'
EXEC sp_MSforeachtable 'SET QUOTED_IDENTIFIER ON';
IF NOT EXISTS (
SELECT
*
FROM
SYS.IDENTITY_COLUMNS
JOIN SYS.TABLES ON SYS.IDENTITY_COLUMNS.Object_ID = SYS.TABLES.Object_ID
WHERE
SYS.TABLES.Object_ID = OBJECT_ID('?') AND SYS.IDENTITY_COLUMNS.Last_Value IS NULL
)
AND OBJECTPROPERTY( OBJECT_ID('?'), 'TableHasIdentity' ) = 1
DBCC CHECKIDENT ('?', RESEED, 0) WITH NO_INFOMSGS;
享受吧,但要小心!
不要这样做!真的,这不是个好主意。
如果知道要截断哪些表,可以创建一个存储过程来截断它们。您可以修复顺序以避免外键问题。
如果您真的想要截断它们(例如,您可以BCP加载它们),那么您可以很快地删除数据库并从头创建一个新的数据库,这将带来额外的好处,即您可以确切地知道您所处的位置。
我喜欢在MSSQL Server developer或Enterprise中使用的另一个选项是在创建空模式后立即创建数据库快照。此时,您可以继续将数据库恢复到快照。
制作一个空的“模板”数据库,进行完全备份。当您需要刷新时,只需使用WITH REPLACE恢复。快速,简单,防弹。如果这里或那里的几个表需要一些基本数据(例如。配置信息,或让你的应用程序运行的基本信息),它也会处理这些。