您必须对源文件进行双重处理。在任务完成之前,数据流中的任何内容都不能更改 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”中完成
- 将
Count the file 任务连接到实际数据流。
- 双击连接线并将评估操作从
Constraint 更改为Expression and Constraint。在表达式字段中,添加类似@[User::RowCountFile] >= @[User::RowCountDB] 的公式
完成。
只有当该公式为真时,连接的项目才会执行。
编辑
接下来的问题是如何在行数不足的情况下停止处理。我会重新组织您现有的工作流程,以拥有一个包含业务逻辑的序列容器是否它应该运行(计数表 + 计数文件),然后第二个序列容器将包含实际的业务处理逻辑(截断表、导入数据、发送通知)