SSIS - 如何一次处理一行

时间:2015-08-12 23:17:50

标签: ssis

目标表已存在1行且IsCurrent = 1 数据源返回2行 我想一次处理一行 所以对于第1行Do查找并将IsCurrent设置为1并将现有行的IsCurrent设置为0 然后我想重复第二行 所以最后我有3行,第3行有IsCurrent到1,其他两个被设置为0

但由于两行都是同时处理的,我无法做到。

我可以使用脚本任务执行此操作,但我希望是否有更简单的方法来执行此操作。

尝试在不使用SSIS SCD转换的情况下进行SCD

2 个答案:

答案 0 :(得分:0)

您一次不需要这一行。避免使用游标或粗略的方法。

根据您的SSIS包,您可以在执行sql任务中执行类似的操作。

第1步:更新目标表

UPDATE D
 SET isCurrent = 0
  FROM DestinationTable D
  JOIN SourceTable S
    ON D.LookupField = S.LookupField

第2步:在目标表中插入新行

INSERT INTO D
  SELECT ... 
   FROM Source 
   JOIN .....
   WHERE ..... 

根据您使用的flavor或SQL Server,您可以使用Upsert(Merge)语句同时进行更新和插入。

您需要考虑的其他事项是: 1.如果目标表有超过1行,该怎么办?你想怎么处理它 2.如果目标表没有匹配的行,该怎么办?

根据上述2的答案,您可能需要更新SSIS包以处理此类情况。

答案 1 :(得分:0)

在SSIS中,作为数据流的一部分,OLE DB目标组件用于将记录插入SQL Server数据库的表中。将数据加载到表中时可以采用相当多的策略。 在OLEDB目标组件属性中有不同的AccessMode,其中一个称为OpenRowSet使用快速加载选项。设置此选项后,可以使用其他FastLoad属性,例如:

FastLoadKeepIdentity FastLoadKeepNulls FastLoadOptions FastLoadMaxInsertCommitSize

执行Fastload时,FastLoadMaxInsertCommitSize设置为0,这意味着完成对表的插入有一个事务,然后为事务应用了Commit。必须管理此值的原因是因为当插入的行数很大(比如一百万/百万)时,将事务分解为每个插入的较少行数是明智的。拥有较小事务的另一个原因是能够有效地管理日志。