目标表已存在1行且IsCurrent = 1 数据源返回2行 我想一次处理一行 所以对于第1行Do查找并将IsCurrent设置为1并将现有行的IsCurrent设置为0 然后我想重复第二行 所以最后我有3行,第3行有IsCurrent到1,其他两个被设置为0
但由于两行都是同时处理的,我无法做到。
我可以使用脚本任务执行此操作,但我希望是否有更简单的方法来执行此操作。
尝试在不使用SSIS SCD转换的情况下进行SCD
答案 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。必须管理此值的原因是因为当插入的行数很大(比如一百万/百万)时,将事务分解为每个插入的较少行数是明智的。拥有较小事务的另一个原因是能够有效地管理日志。