【问题标题】:Dyanamic Column Mapping in SSISSSIS 中的动态列映射
【发布时间】:2014-07-04 00:07:36
【问题描述】:

我有一个 excel 源和 sql 数据库是目标。这里的问题是 excel 列名每周都会更改。他们可能会添加新列或重命名列/有时他们会删除一些列。因此,每当 excel 列发生更改时,ssis 都会引发错误,我不得不再次手动映射它们。有什么办法可以自动完成吗? 请帮忙

【问题讨论】:

  • 如果添加了 Excel 文件中的列,是否要在 SQL 表中添加新列?如果它们被删除,是否要删除 SQL 表列?如果 Excel 列被重命名,您是要同时重命名 SQL 列,还是只映射到旧的列名?如果可以,请提供一些更改示例。
  • 回答您的问题。如果添加了新列,那么是的,我想将它们添加为 sql 中的新列。如果放在 excel-no 中,则不应将其放在 sql 中。如果重命名则 - 否,它应该映射旧列。

标签: ssis


【解决方案1】:

我能想到的唯一方法是使用脚本组件。本质上,您需要做的是:

  1. 将Excel文件数据读入DataTable;见:Reading Excel files from C#
  2. 创建一个列表,其中包含从 Excel 文件中读取的所有列名。我们将使用它来比较目标 SQL 表的字段名称。
  3. 创建一个包含目标 SQL 表的所有列名的列表。
  4. 将您的列表与一些模糊匹配逻辑进行比较,以查看您的 Excel 文件和 SQL 表之间的列名是否相同。您可以使用的算法将取决于变量 Levenshtein 可能是执行此操作的好方法:http://www.dotnetperls.com/levenshtein
  5. 根据您在上述第 4 步中的比较,动态构建 SQL 查询来为新的 Excel 列编写所有 ALTER TABLE/ADD COLUMN 语句。
  6. 使用 SQLBulkCopy 的 ColumnMapping 类来映射步骤 4 中模糊匹配的列名,将上述步骤 1 中的 DataTable 加载到 SQL 表中。http://msdn.microsoft.com/en-us/library/System.Data.SqlClient.SqlBulkCopyColumnMapping(v=vs.110).aspx

【讨论】:

    【解决方案2】:

    由于您的源列不断变化,您需要编写自定义脚本,您可以根据源发生的变化来放置您的逻辑。

    脚本逻辑应该是,获取 excel 文件,读取列标题,然后推断如何处理 excel。然后,您可以将此 Excel 重新定向到适当的组件。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多