定期更新SSIS中的表

时间:2014-01-28 23:00:37

标签: sql-server ssis sql-update insert-update

如何定期更新SSIS中的数据库表。该表具有外键约束。 我每周都有一个包运行,我必须从平面文件更新表中的数据。大多数内容与更新值和其他新行相同。

UPDATE :我的数据文件包含更新的内容(缺少某些行,添加了一些行,修改了一些行)。数据文件没有主键(我在第一次批量插入数据文件时创建主键),在后续的SSIS包运行中,我需要使用新的数据文件内容更新表。

e.g。

table
---------------------------------------------
1    Mango   $0.99
2    Apple   $0.59
3    Orange  $0.33


data file 
---------------------------------------------
Mango   0.79
Kiwi    0.45
Banana  0.54

如何使用文件中的数据更新表格。该表与其他表具有外键约束。

2 个答案:

答案 0 :(得分:1)

以下是一些想法/步骤:

  • 创建平面文件连接管理器。
  • 参加数据流任务。
  • 使用刚刚创建的连接管理器创建平面文件源。
  • 根据源文件值获取FK值所需的查找转换次数。
  • 在所有上述查找之后进行查找转换,以从Destination表中获取所有值。
  • 保留条件分割并比较源值和目标值。
  • 如果所有列都匹配,则UPDATE,否则INSERT。
  • 根据OLEDB Destnation / OLEDB Command对条件分割结果进行映射。

尝试一下,让我知道结果/评论。

答案 1 :(得分:1)

另一种方法,即加载大量组数据而不是逐行处理:

在数据库

  • 创建一个临时表(例如StagingTable [name],[price])
  • 创建一个过程(您可能需要更改对象名称,然后添加 事务控制和错误处理等只是一个草案):

    create procedure spLoadData
    

    如 开始

    update DestinationTable
       set DestinationTable.Price = StagingTable.Price
      from DestinationTable
      join StagingTable
        on DestinationTable.Name = StagingTable.Name
    
    insert into DestinationTable
          (Name, Price)
    select Name, Price
      from StagingTable
     where not exists (select 1 
                         from DestinationTable
                        where DestinationTable.name = StagingTable.Name)
    

    结束

关于SSIS

  • 使用(truncate [staging_table_name])执行SQL任务

  • 数据流任务从平面文件传输到临时表

  • 执行SQL任务,调用您创建的过程(spLoadData)。