Sql SSIS-删除现有行,然后插入,结果不完整
我对SSIS比较陌生,知道处理副本是一个经常重复的问题,因此提前感谢您阅读我的文章,并感谢您对我复杂情况的帮助 我有一个18179行的小表(我们称之为Destination),需要使用平面文件用SSI更新它。我正在测试的18179行平面文件只包含目标中存在且已更改的记录。目前,我有一个包,它从平面文件加载一个staging表(我们称之为Stage),然后移动到数据流并进行查找 此数据流接受Stage,并使用主键OrderID从目标上的Stage查找LKP_OrderID,以查看记录是否存在。 如果目标中不存在OrderID,则它将遵循新的OrderID路径,并将记录插入DST_OLE_Dest的目标中 这就是我遇到的问题:如果OrderID确实存在于目标中,那么它将遵循现有的OrderID路径。CMD_Delete_Duplicates OLE DB命令执行:Sql SSIS-删除现有行,然后插入,结果不完整,sql,tsql,ssis,Sql,Tsql,Ssis,我对SSIS比较陌生,知道处理副本是一个经常重复的问题,因此提前感谢您阅读我的文章,并感谢您对我复杂情况的帮助 我有一个18179行的小表(我们称之为Destination),需要使用平面文件用SSI更新它。我正在测试的18179行平面文件只包含目标中存在且已更改的记录。目前,我有一个包,它从平面文件加载一个staging表(我们称之为Stage),然后移动到数据流并进行查找 此数据流接受Stage,并使用主键OrderID从目标上的Stage查找LKP_OrderID,以查看记录是否存在。
DELETE d
FROM dbo.Destination d
INNER JOIN dbo.Stage s ON d.OrderID = s.OrderID
这将从目标中删除阶段中存在的所有记录。然后,它应该在DST_OLE_Desti的Stage中插入这些记录的更新版本。
然而,它似乎分两批处理18179行:第一批处理9972行
然后,在第二批中,它处理剩余的8207行。它显示它将所有18179行插入到目标,但我只在目标中最后一批8207行
我相信它删除并插入了第一批9972行,然后对第二批8207行再次运行上面的delete-from-internal-join-SQL,无意中删除了刚刚插入的9972行,留下了8207行
我发现,将DefaultBufferSize最大化为104857600字节,并在数据流中增加DefaultBufferMaxRows,以便包一次处理所有18179行,从而正确地删除和插入所有18179行,但一旦我的数据超过104857600文件大小,这将再次成为一个问题。我还可以使用OLE DB命令转换来运行
DELETE FROM dbo.Destination WHERE OrderID = ?
这应该从Stage传递OrderID,并从存在匹配项的目的地删除,但这需要大量的时间,对于这个小表需要约10分钟。这个问题还有其他解决办法吗?如果插入和删除是更好的选择,我如何进行更新而不是插入和删除?您可以使用SSIS工具箱中缓慢变化的维度工具来更新行(而不是删除和重新插入)。您只需要根据“类型1”的声音进行更改,因此不需要使用历史属性插入输出
它会自动处理插图中的两个流-插入和更新是的,这里有逻辑问题。OLE DB命令正在为流经它的每一行触发delete语句 相反,您希望该步骤成为数据流的先例(执行SQL任务)。这将在开始加载之前清除目标表中的现有数据。否则,您将退出新加载的数据,正如您所观察到的那样
有不同的处理方法。如果删除工作,请继续。否则,人们通常会对辅助表进行阶段性更新,然后使用执行SQL任务作为数据流任务的后续任务,并执行基于集合的更新。就是这样做的,看起来效果很好。非常感谢。