【问题标题】:Updating Rows In a Table That Was Used to Import From SSIS更新用于从 SSIS 导入的表中的行
【发布时间】:2015-06-12 14:49:53
【问题描述】:

我正在创建一个 SSIS 包,它从一个表中选择前 2000 个条目并将这些条目插入到另一个表中。如何更新原始表中的这些条目(我的选择包含一个条件,通过该条件我检查状态仍然为空的位置),以便在下次运行 SSIS 包时不会导入它们?

**编辑 由于出于安全原因我无法提供 DLL,为了勾画我的场景,我有 TableA 和 TableB 共享相同的结构:

  • 索引号(主键、索引、自动增量)
  • 名称(varchar)
  • 姓氏(varchar)
  • 状态(varchar)
  • 类型(varchar)
  • 导入日期(日期)

在我的数据流任务中使用 OLE DB 源,以下查询用于确定我应该将哪些情况从 TableA 导入到 TableB(OLE DB 目标):

SELECT TOP(2000) * 
FROM TableA 
 WHERE Status = '' 
  AND [Type] = 'New Case' 
ORDER BY IndexNumber ASC

现在那些从 TableA 导入到 TableB 的案例,我想更新表 A 中的案例以不再导入它们。 TableB中的数据经常被转移到另一个数据库中,所以我不能用它来比较。

【问题讨论】:

  • 请提供 DDL 以及每个表的一些示例数据。如果表格上没有某种标识符,您想要做的事情将很困难。
  • 您是否需要确认他们是通过 SSIS 管道一路完成的,还是只是标记他们已被拾取?
  • 我只是想添加一些更新来标记被拾取的行。

标签: sql-server ssis package


【解决方案1】:

我建议你使用这种模式:

  1. 首先更新源表并将 1000 条记录标记为“准备提取”,即将它们设置为 1
  2. 接下来,从源表中选择所有准备提取的记录

  3. 最后,如果提取成功,将 1(准备提取)更新为 2(提取成功)

【讨论】:

  • summerpet39 和尼泊尔新秀的回答也有很大帮助,但是根据你的建议构建我的包效果很好(只是尝试了 10 条记录的小样本)。设计很简单,很实用,谢谢!
【解决方案2】:

我会这样做:

我会在控制流的末尾添加一个Execute SQL Task,以将原始表中的前 2000 条记录更新为其他状态(状态 = 3 或其他状态)。这样,由于您已经在查询中进行了空检查,因此它不会在您的下一次运行中选择那些最初的 2000 条记录。

【讨论】:

  • 如果我这样做,以确保更新了正确的前 2000 个,添加 order by 语句以确保更新确切的行是否明智?
  • 是的,您可以像@Nick.McDermaid 建议的那样将这些记录设置为不同的状态。然后,在流程结束时再次更新他们的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多