我有一个数据库的测试环境,我想在测试周期开始时用新数据重新加载该数据库。我对重建整个数据库不感兴趣——只是简单地“重新设置”数据。

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


当前回答

对于SQL 2005,

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

2000年和2005/2008年的链接更多。

其他回答

这是数据库擦除脚本之王。它将清除所有表并正确地重新播种:

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;

享受吧,但要小心!

select 'delete from ' +TABLE_NAME from INFORMATION_SCHEMATABLE_TYPE='BASE TABLE'的表

结果就在那里。

在查询窗口复制粘贴并运行命令

这是一种方法……可能还有其他10种更好/更有效的方法,但这听起来似乎很少有人这样做,所以下面是……

从sysobjects中获取一个表列表,然后用游标遍历这些表,为每次迭代调用sp_execsql('truncate table ' + @table_name)。

用脚本删除数据库要容易得多(甚至可能更快),然后直接从脚本中删除并创建数据库。

虽然有点晚了,但也许能帮到别人。 我有时会创建一个过程,使用T-SQL执行以下操作:

将所有约束存储在临时表中 删除所有约束 除某些不需要截断的表外,截断所有表 重新创建所有约束。

我已经把它列在我的博客上了