覆盖SSIS包中旧行的简便方法

时间:2019-03-26 08:52:47

标签: sql-server ssis

我用脚本组件创建了一个SSIS包,该脚本组件从JSON API调用数据并将其插入SQL Server中的表中。我已经设置了添加新行的逻辑,但是我想找到删除/覆盖旧行的最合适方法。数据每4小时获取一次,因此,每次运行包时,大约有1000行重叠。

我的第一个想法是在数据流任务之后简单地添加一个SQL任务,以删除重复的行(具有最小的ID号)。但是,我想知道如何在“数据流任务”中执行此操作?每次API调用最多提取5000行,目标表大约有1m行,并且整个项目的运行时间约为。 10秒

我简单的数据流任务如下:

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以尝试两种主要方法:

  • 对行ID运行查找。如果匹配,请使用UPDATE语句为每行运行OLEDB命令转换。如果不匹配-将行直接定向到OLE DB目标。
    易于实现,简单明了的逻辑,但是大量的UPDATE语句将导致性能问题。

  • 在数据库中创建一个中间表,在运行数据流任务之前将其清理,然后将数据流中的所有行存储到该中间表中。然后在下一个任务上-执行以下任一操作:

    • select c.* from companies c left join workers w on c.id = w.company_id group by c.id order by count(w.id) desc; 中间表和主表。有关MERGE的更多信息。

    • 在事务处理中-从中间表上存在的主表中删除行,然后执行MERGE

我通常更喜欢采用MERGE的中间表方法-高性能,简单且灵活。在并发会话或集群列存储表中运行时,MERGE语句可能会产生不利影响,然后我将中间表与INSERT INTO <main table> SELECT ... FROM <intermediate table>命令一起使用

答案 1 :(得分:2)

因此,我发现在我的情况下(只有相对较少的行要更新),最简单的解决方案是使用OLE DB组件,如下所示。

enter image description here

在组件中,我添加了具有以下逻辑的Update SQL语句

UPDATE  [dbo].[table]
SET    [value1]=?,
       [value2]=?,
       [value2]=?,
WHERE  [value1]=? 

然后,我将参数映射到它们对应的列,并确保我的where子句使用查找匹配输出来更新正确的行。该组件确保使用我在Lookup组件中使用的列来更新“ Lookup Match Output”。

enter image description here