Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SSIS-删除现有行,然后插入,结果不完整_Sql_Tsql_Ssis - Fatal编程技术网

Sql SSIS-删除现有行,然后插入,结果不完整

Sql SSIS-删除现有行,然后插入,结果不完整,sql,tsql,ssis,Sql,Tsql,Ssis,我对SSIS比较陌生,知道处理副本是一个经常重复的问题,因此提前感谢您阅读我的文章,并感谢您对我复杂情况的帮助 我有一个18179行的小表(我们称之为Destination),需要使用平面文件用SSI更新它。我正在测试的18179行平面文件只包含目标中存在且已更改的记录。目前,我有一个包,它从平面文件加载一个staging表(我们称之为Stage),然后移动到数据流并进行查找 此数据流接受Stage,并使用主键OrderID从目标上的Stage查找LKP_OrderID,以查看记录是否存在。

我对SSIS比较陌生,知道处理副本是一个经常重复的问题,因此提前感谢您阅读我的文章,并感谢您对我复杂情况的帮助

我有一个18179行的小表(我们称之为Destination),需要使用平面文件用SSI更新它。我正在测试的18179行平面文件只包含目标中存在且已更改的记录。目前,我有一个包,它从平面文件加载一个staging表(我们称之为Stage),然后移动到数据流并进行查找

此数据流接受Stage,并使用主键OrderID从目标上的Stage查找LKP_OrderID,以查看记录是否存在。 如果目标中不存在OrderID,则它将遵循新的OrderID路径,并将记录插入DST_OLE_Dest的目标中

这就是我遇到的问题:如果OrderID确实存在于目标中,那么它将遵循现有的OrderID路径。CMD_Delete_Duplicates OLE DB命令执行:

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任务作为数据流任务的后续任务,并执行基于集合的更新。

就是这样做的,看起来效果很好。非常感谢。