【问题标题】:SSIS: Excel source - is it possible to track changed made in excel?SSIS:Excel 源代码 - 是否可以跟踪在 excel 中所做的更改?
【发布时间】:2020-01-26 15:57:23
【问题描述】:

假设我在 excel 中有以下列:级别、组、代码、名称、日期、具有以下值的附加信息:
1,A,1234,约翰,2019-09-01,信息 1
1,A,1234,约翰,2019-09-01,信息 2

我目前有以下导入逻辑,如果数据库中没有特定代码和级别的记录,则插入新记录,如果数据库中已存在代码,则更新记录。但由于 excel 中没有唯一标识符,因此很难更新正确的记录。在这种情况下,常用的方法是什么?

假设在上面的示例中,组或日期将更改为一条记录。如何实现更新数据库中正确记录的逻辑。

【问题讨论】:

  • 请提供您的代码以及您为实现这一目标所做的工作?
  • 当我读到这个标题时,我倒吸一口凉气。只需将其转储到临时表中并在那里完成您的工作。不要将 Excel 用作数据库。这样做不好。

标签: sql sql-server excel ssis etl


【解决方案1】:

如果没有唯一的主键,您将无法拥有不同的数据集。如果没有这样的主键,您将无法只更新一行,而是更新一个或多个类似的行。在当前状态下,无法准确地跟踪更改。

如果您确实有唯一的主键,最简单的解决方案是附加日期时间作为跟踪更改的一种方式,并在任何值更改时将其添加为新行。您的数据集如下所示:

1, A, 1234, John, 2019-09-01, Info1, DateCreated, DateChanged
1, A, 1234, John, 2019-09-01, Info2, DateCreated, DateChanged2
1, A, 1234, John, 2019-09-01, Info3, DateCreated, DateChanged3

请务必记住,这仅适用于静态主键,通常用于复合键的某些字段可能不起作用。用户可以更改他们的姓名或纠正错误输入的出生日期,这可能会更改某些复合键。

在 SSIS 中,这将使用两个查找任务来实现:

  • 在第一个查找任务中比较主键。如果主键不存在,请使用派生列任务将 DateCreated 和 DateModified 设置为 GETDATE()。
  • 如果主键确实存在,则运行第二个查找任务来比较记录中的所有行。如果它们都相同,则意味着记录没有更改,并且不需要将更新发送到数据库。
  • 如果存在差异,则使用派生列 SSIS 任务仅将 DateModified 列更新为 GETDATE() 并将其添加为新行。

这三个分支选项应考虑每个潜在状态:新记录、没有更改的现有记录、有更改的现有记录

【讨论】:

    【解决方案2】:

    由于您没有唯一标识符,因此您应该尝试创建自己的标识符。在类似的情况下,我将使用派生列来连接我确信它不会更改的所有值。例如:

    Level + "|" + Code + "|" + Name + "|" + Additional info
    

    然后我将根据该派生列比较源数据和现有数据。您可以选择将这些派生列存储在目标数据库中,也可以使用临时表来存储这些值。

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多