截断表?

时间:2009-12-15 13:53:05

标签: ssis

我正在尝试创建一个Integration Service项目,该项目将使用一组现有(旧版)数据库来创建新数据库。由于我是SSIS菜鸟,我的进步相当增量,在整个目标数据库上添加截断将帮助我更轻松地测试它。

这样的事情可能吗?

4 个答案:

答案 0 :(得分:1)

此SQL语句将为您完成。如果您希望它成为IS项目的一部分,那么将其作为SQL脚本任务的SQL。

declare @object_id int
declare @str varchar(255)

select @object_id = min(object_id) 
from sys.tables
where name <> 'sysdtslog90'

while @object_id is not null
begin
    select @str = 'truncate table ' + name
    from sys.tables
    where object_id = @object_id

    print @str
    exec (@str)

    select @object_id = min(object_id) 
    from sys.tables
    where object_id > @object_id
    and name <> 'sysdtslog90'
end

如果您对使用sys.tables视图不满意,那么您可以自己定义表列表。

答案 1 :(得分:0)

这是一个有趣的解决方案

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341

答案 2 :(得分:0)

为什么要使用这么复杂的SQL语句?为什么不将Execute SQL Task与值为(DELETE FROM tablename WHERE Con​​trolKey =?)的表达式变量一起使用

答案 3 :(得分:0)

这里有一个Doctrine 1.2代码清空所有表,忽略了innoDB外来的KEYS。我用它来引导单元测试

/**
 * Empty all tables, ignoring innoDB foreign keys
 */
function emptyTables()
{
    $conn = Doctrine_Manager::getInstance()->getCurrentConnection();
    $stmt = $conn->prepare('SHOW TABLES');
    $stmt->execute();

    $queries = "SET FOREIGN_KEY_CHECKS = 0;";
    foreach($stmt->fetchAll() as $table) {
        $queries .= "TRUNCATE  `".array_shift($table)."`;\n";
    }
    $queries .= "SET FOREIGN_KEY_CHECKS = 1;";

    $conn->getDbh()->query($queries);
}