截断SQL数据库中的几乎所有表

时间:2015-07-01 21:07:51

标签: mysql sql-server sql-server-2008 truncate

我对SQL非常陌生,所以请告诉我,如果有什么地方我可以自己更好地回答这个问题。

我有一个包含数百个表的数据库,这些表的填充程度不同。我需要截断几乎所有这些测试,同时保留一些数据用于配置。

我已经看到很多关于截断所有的帖子(即使是外键,我也有),但是我希望有一些jiggery pokery我可以做一些'if'类型结构。最好的解决方案是复制掉那几张表,做this,然后将数据复制回来吗?

2 个答案:

答案 0 :(得分:1)

正如您所提到的,您是SQL的新手,这里有一个非常基本的脚本来生成TRUNCATE查询:

DECLARE @ExcludedTables TABLE (TableName NVARCHAR(MAX))
INSERT INTO @ExcludedTables VALUES ('Table1')
INSERT INTO @ExcludedTables VALUES ('Table2')
INSERT INTO @ExcludedTables VALUES ('Table3')

SELECT 'TRUNCATE TABLE [' + S.[name] + '].[' + T.[name] + ']', T.*
FROM sys.tables AS T 
INNER JOIN sys.schemas AS S ON T.schema_id = S.schema_id 
WHERE T.[name] NOT IN (SELECT TableName FROM @ExcludedTables)

我创建了一个表变量,您可以在其中插入要排除的表名。您也可以使用临时表,甚至普通表来实现此目的。

答案 1 :(得分:0)

限制某些表格并不困难。您可以创建一个临时表或表变量及其名称。然后,您可以创建数据库中所有表名的列表,其名称不在为您的管理员创建的结构中。

假设数据库具有外键,您必须以正确的顺序截断表或禁用/删除约束。这比上面更令人头疼,但可能还有例行程序。

具体细节需要知道你正在使用什么数据库系统(sql server,my sql,oracle等)