【问题标题】:update a table in SSIS periodically定期更新 SSIS 中的表
【发布时间】:2014-02-20 12:42:25
【问题描述】:

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

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

例如

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


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

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

【问题讨论】:

  • 问题是您要安排它(使用 SQL 代理作业)还是要更新以及插入数据?
  • @ElectricLlama 问题是更新表格。
  • 正如 ElectricLlama 所说,创建一个 SQL 代理作业并安排在那里运行 SSIS 包。 :)
  • @Kahn 要是我知道魔法就好了!!!我可以在 SQL 服务器代理中安排它,这不是问题。问题是我不确定如何在不更改主键的情况下使用外键约束更新现有表。
  • 这就是人们欣赏例子的原因。 :) 您的更新是否涉及 FK 约束?如果它是一个更新,主键怎么会是一个问题?基本上,给我们举个例子,说明表中的内容,您在其中的内容,以及为什么 FK 和 PK 会成为问题?

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


【解决方案1】:

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

关于数据库

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

    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)。

【讨论】:

  • 谢谢,我真的很感激。实际上我有 200 万条记录,这看起来是对的。
【解决方案2】:

以下是一些想法/步骤:

  • 创建平面文件连接管理器。
  • 执行数据流任务。
  • 使用刚刚创建的连接管理器创建平面文件源。
  • 根据您的源文件值进行尽可能多的查找转换,以获取 FK 值。
  • 在上述所有查找之后进行查找转换,以获取目标表中的所有值。
  • 保持条件拆分并比较源值和目标值。
  • 如果所有列都匹配,则更新,否则插入。
  • 根据 OLEDB 目标/OLEDB 命令映射上述条件拆分结果。

试一试,让我知道结果/cmets。

【讨论】:

  • 我会试一试,看起来可行。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多