遍历表格或复制粘贴

Loï*_*pes 5 ms-access sql-server migration ssis

我必须做一个迁移,我应该从 40 个 Access 表中检索数据,这些表应该包含几个相同的列(但不是全部,模式不同)。为简化起见,我使用 SSMA 在 SQL Server 中转换这些表。

它是通过 SSIS 迁移的一部分。我必须将所有这些表合并到一张表中,而不会重复。所有表格的部分处理都是相同的,但有一些微妙之处。一个问题是列名略有不同(如 X_Y 而不是 X)。每个表都有特定的列,但我不想检索其中的数据。

我希望这不是一个太宽泛的问题,但是:

  • 尝试做一个通用的部分,将表名作为变量,对其中的条件应用相同的处理来处理差异是否更好?

  • 或者我应该只是复制和粘贴核心/模板数据流并在单独的包中管理每个差异?

Sol*_*zky 5

鉴于:

  • 有一些列您不想为每个表拉出
  • 每个表的列名都不一样
  • 你只有40张桌子
  • 这是一次性迁移(这是安全的假设,对吗?)

然后我会复制并粘贴核心数据流,并根据需要对每个表进行更改。对于包含少量表(不是 200 个或更多)的非重复过程,您不想花太多时间创建一个永远不会重复的可重复过程 ;-)。无论如何,您都将不得不管理差异,因此您不妨将精力放在这部分上。

并且应该可以在 SSIS 中定义一个可重用的组件(脚本任务)来处理一些“常见”操作。如果没有,只需创建一个接受表名的存储过程并处理那里的常见步骤。然后,在 SSIS 中,只需为每个表调用该存储过程,这样您就可以为公共内容定义一个单一的定义,如果您需要对公共更改进行轻微更改,那么您只需要在一处:)。

(请参阅下面的 UPDATE 部分)当您遇到无法拉取所有字段和可能重命名字段的问题时,处理数据迁移的另一种选择是使用SqlBulkCopy.NET 中的类,因为它可以很好地处理这些事情。您可以在 SSIS 中创建一个 C# 任务来使用此类,也可以使用 SQLCLR 存储过程,例如DB_BulkCopy,它是SQL# SQLCLR 库的一部分(我是该库的作者,但该存储过程在 Free版本)。我在以下答案中更详细地描述了这一点:

将数据从一个数据库导入到另一个脚本

更新

在我发布上述建议后的第二天添加了以下要求:

我必须将所有这些表合并到一张表中,而不会重复。

鉴于这一新要求,我认为使用SqlBulkCopy替代选项不如以我首先描述的方式坚持使用 SSIS 有吸引力。使用SqlBulkCopy/ DB_BulkCopy对数据进行重复数据删除的唯一方法是从目标服务器/目标服务器运行该进程,将数据加载到临时表中(它必须是一个全局临时表——意思​​是从 开始##)源服务器使用SqlBulkCopyDB_BulkCopy,然后从全局临时表插入真正的目标表,同时根据确定重复项的任何规则过滤掉“重复项”。