在插入数据库之前,如何验证SSIS文件中的数据?

时间:2015-05-08 13:50:39

标签: validation ssis

我想要做的是从dbf文件中获取数据并将其插入表中。我已经做过了。由于文件很多,因此正在使用For-Each Container。但是,在将其插入表格之前,我想查看日期字段并将其与日期变量进行比较。如果日期与变量匹配,则转到流程的步骤。但是,如果任何日期与变量不匹配,则丢弃该文件及其内容,并查看下一个文件。

如何在SSIS中完成此任务?

1 个答案:

答案 0 :(得分:1)

您正在数据流任务中寻找条件性拆分组件。

假设您的源列是MyDate并且您有一个名为@[User::ReferenceDate]的SSIS变量,那么您应用类似

的表达式
[MyDate] == @[User::ReferenceDate]

当日期匹配时,它将评估为True,否则为false。

在条件拆分中,在组件中添加一行。

  • OutputName:DatesMatched
  • 条件:[MyDate] == @[User::ReferenceDate]
  • 默认输出名称:DatesUnmatched

现在,当您将输出连接到目的地时,它会询问您是否要使用DatesMatched或DatesUnmatched路径路由数据。使用DatesMatched路径。

当我重新阅读此内容时,if any of the dates don't match the variable, then that file and its contents are discarded然后您正在考虑对文件进行双重处理。第一次阅读全部并验证它。第二次,可选,实际上将加载到数据库。

从条件分割中,将RowCount添加到DatesUnmatched路径。使用名为CountDatesUnmatched的Integer / Int32类型的变量。在一个完美的世界中,当文件验证完成时,它将为零。

在验证数据流与实际导入数据流之间的先例约束中,双击连接线并将评估标准从Constraint更改为Expression and Constraint。将值保留为Success并在Expression中使用@[User::CountDatesUnmatched] == 0如果两个条件都为真,那么数据流将只亮起:解析成功并且没有行发送到行计数组件。

最后,你可以作弊,有时这种方法是有道理的。如果您正在使用OLE DB目标,则可以使用默认2B的MaximumInsertCommitSize和fast load的数据访问模式。这转化为"一切都将提交,或者它都不是"。这可能会锁定目标表并导致您的事务日志严重增长,具体取决于您要加载的数据量。如上所述使用条件性拆分,但对于DatesUnmatched路径,会导致失败。除数为零的派生列或带有显式FireError事件的脚本任务将导致该事务陷入困境。您需要在OnError事件处理程序中做一些魔法才能不中止整个文件处理,但它是一个懒惰的黑客(或者在双重读取文件时非常有用,但对数据库的影响较小) )

相关问题