【问题标题】:SSIS Only continue through flow if one source row count is higher than anotherSSIS 仅在一个源行数高于另一个源行数时继续流
【发布时间】:2016-01-08 14:03:14
【问题描述】:

我正在生成一个 SSIS 包以从 CSV 文件更新数据库,该包将在将 CSV 文件中的所有行插入其中之前截断数据库表。

作为一项检查,我想确保 CSV 文件中的行数多于数据库中的行数,因此当我加载这些行时,我将每个行数存储在两个变量 csvCount 和 dbCount 中。

我想能够在数据流中说:

IF csvCount > dbCount then
 move onto next flow task
else
 exit package and prevent any other tasks / control flows running
end

但我不确定我可以使用什么组件。

非常感谢任何帮助

编辑:在序列容器运行后即使条件失败也能说明任务的图像

【问题讨论】:

    标签: visual-studio-2012 ssis ssis-2012


    【解决方案1】:

    您必须对源文件进行双重处理。在任务完成之前,数据流中的任何内容都不能更改 SSIS 变量的状态。

    数表

    因此,您可以在包的开头使用执行 SQL 任务来计算目标表中的行数并将行数分配给您的变量。我喜欢这个查询来获取行数,因为它比通过SELECT COUNT(*) AS RC FROM MyTABLE;直接计算表要快得多

    SELECT
        s.[Name] as [Schema]
    ,   t.[name] as [Table]
    ,   SUM(p.rows) as [RowCount]
    FROM
        sys.schemas s
        LEFT OUTER JOIN 
            sys.tables t
            ON s.schema_id = t.schema_id
        LEFT OUTER JOIN 
            sys.partitions p
            ON t.object_id = p.object_id
        LEFT OUTER JOIN  
            sys.allocation_units a
            ON p.partition_id = a.container_id
    WHERE
        p.index_id  in(0,1) -- 0 heap table , 1 table with clustered index
        AND p.rows is not null
        AND a.type = 1  -- row-data only , not LOB
        -- ADD YOUR FILTER HERE
    GROUP BY 
        s.[Name]
    ,   t.[name]
    ORDER BY 
        1
    ,   2;
    

    统计文件

    然后您添加一个数据流任务,就像您在上面所做的那样,但它只有一个平面文件源连接到一个行计数组件。

    作为这个任务的输入,像往常一样将Count the table任务连接到它

    实际数据流

    这里有你的实际数据流。平面文件源到任何目标的任何转换。

    让你提供的伪代码工作的魔法将在“Precedent Constraint”中完成

    1. Count the file 任务连接到实际数据流。
    2. 双击连接线并将评估操作从Constraint 更改为Expression and Constraint。在表达式字段中,添加类似@[User::RowCountFile] >= @[User::RowCountDB] 的公式

    完成。

    只有当该公式为真时,连接的项目才会执行。

    编辑

    接下来的问题是如何在行数不足的情况下停止处理。我会重新组织您现有的工作流程,以拥有一个包含业务逻辑的序列容器是否它应该运行(计数表 + 计数文件),然后第二个序列容器将包含实际的业务处理逻辑(截断表、导入数据、发送通知)

    【讨论】:

    • 非常感谢,如果这些在序列容器中,我如何防止其他容器运行?
    • 帮助我理解问题的序列容器部分。快速截屏并编辑您的问题以显示由于文件数少于数据库而应该/不应该运行的内容
    • 刚刚完成,如果条件失败,我基本上希望整个包停止运行,但您可以在这种情况下看到下一个序列容器运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2013-08-11
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多