繁体   English   中英

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

[英]Easy way of overwriting old rows in SSIS Package

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

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

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

在此处输入图片说明

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

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

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

    • MERGE中间表与主表。 有关MERGE的更多信息。

    • 在事务中-从中间表上存在的主表中删除行,然后执行INSERT INTO <main table> SELECT ... FROM <intermediate table>

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

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

在此处输入图片说明

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

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

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

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM