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

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


当前回答

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

其他回答

对于SQL 2005,

EXEC sp_MSForEachTable 'TRUNCATE TABLE ?'

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

在截断表之前,必须删除所有外键。使用此脚本生成最终脚本,以删除和重新创建数据库中的所有外键。请将@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;

享受吧,但要小心!

如果你想在一个特定的表(即静态查找表)中保留数据,同时删除/截断同一数据库中其他表中的数据,那么你需要一个循环,其中包含异常。这就是我在无意中发现这个问题时所寻找的。

sp_MSForEachTable对我来说似乎有bug(即与IF语句不一致的行为),这可能是为什么它没有被MS记录的原因。

declare @LastObjectID int = 0
declare @TableName nvarchar(100) = ''
set @LastObjectID = (select top 1 [object_id] from sys.tables where [object_id] > @LastObjectID order by [object_id])
while(@LastObjectID is not null)
begin
    set @TableName = (select top 1 [name] from sys.tables where [object_id] = @LastObjectID)

    if(@TableName not in ('Profiles', 'ClientDetails', 'Addresses', 'AgentDetails', 'ChainCodes', 'VendorDetails'))
    begin
        exec('truncate table [' + @TableName + ']')
    end 

    set @LastObjectID = (select top 1 [object_id] from sys.tables where [object_id] > @LastObjectID order by [object_id])
end

最简单的方法就是

打开SQL Management Studio 导航到数据库 右键单击并选择任务->生成脚本(pic 1) 在“选择对象”界面,选择“选择特定对象”选项并勾选“表格”(图2) 在下一个屏幕上,选择“高级”,然后将“Script DROP and CREATE”选项更改为“Script DROP and CREATE”(图3) 选择将脚本保存到新的编辑器窗口或文件中,并根据需要运行。

这将为您提供一个删除和重新创建所有表的脚本,而无需担心调试或是否包含了所有内容。虽然这不仅仅执行截断,但结果是相同的。请记住,自动递增的主键将从0开始,而截断的表将记住最后分配的值。如果在PreProd或Production环境中无法访问Management studio,也可以从代码中执行此操作。

1.

2.

3.