SSIS 只有在一个源行计数高于另一个源行计数时才继续通过流程
SSIS Only continue through flow if one source row count is higher than another
我正在生成一个 SSIS 包以从 CSV 文件更新数据库,该包将 运行 分类数据库 table 然后再将 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
但我不确定我可以使用什么组件。
非常感谢任何帮助
编辑:图像说明序列容器后的任务是 运行 即使条件失败
您必须加倍处理您的源文件。在任务完成之前,数据流中的任何内容都不能更改 SSIS 变量的状态。
计数table
因此,您可以在包的开头使用执行 SQL 任务来计算目标 table 中的行数并将行数分配给您的变量。我赞成使用此查询来获取行数,因为它比通过 SELECT COUNT(*) AS RC FROM MyTABLE;
直接计算 table 快得多
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"
中完成
- 将
Count the file
任务连接到实际数据流。
- 双击连接线并将计算操作从
Constraint
更改为 Expression and Constraint
。在表达式字段中,添加一个公式,例如 @[User::RowCountFile] >= @[User::RowCountDB]
完成。
只有当该公式为真时,连接的项目才会执行。
编辑
接下来的问题是如何在行数不足的情况下停止处理。我会重新组织您现有的工作流程,让序列容器包含 是否 是否应该 运行 的业务逻辑(计算 tables + 计算文件)然后第二个Sequence Container会包含实际的业务处理逻辑(t运行catetable,导入数据,发送通知)
我正在生成一个 SSIS 包以从 CSV 文件更新数据库,该包将 运行 分类数据库 table 然后再将 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
但我不确定我可以使用什么组件。
非常感谢任何帮助
编辑:图像说明序列容器后的任务是 运行 即使条件失败
您必须加倍处理您的源文件。在任务完成之前,数据流中的任何内容都不能更改 SSIS 变量的状态。
计数table
因此,您可以在包的开头使用执行 SQL 任务来计算目标 table 中的行数并将行数分配给您的变量。我赞成使用此查询来获取行数,因为它比通过 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"
中完成- 将
Count the file
任务连接到实际数据流。 - 双击连接线并将计算操作从
Constraint
更改为Expression and Constraint
。在表达式字段中,添加一个公式,例如@[User::RowCountFile] >= @[User::RowCountDB]
完成。
只有当该公式为真时,连接的项目才会执行。
编辑
接下来的问题是如何在行数不足的情况下停止处理。我会重新组织您现有的工作流程,让序列容器包含 是否 是否应该 运行 的业务逻辑(计算 tables + 计算文件)然后第二个Sequence Container会包含实际的业务处理逻辑(t运行catetable,导入数据,发送通知)