【问题标题】:Loading data from multiple db to another server using SSIS使用 SSIS 将数据从多个数据库加载到另一台服务器
【发布时间】:2016-11-22 16:54:02
【问题描述】:

我使用 SSIS 包将表列和数据从一个数据库移动到另一个数据库。

服务器 A、数据库 A、表 A

服务器 B、数据库 B、表 B(但仅包含表 A 中的选定列)

我已将数据流任务与 OLEDB 源和 OLEDB 目标一起使用。派生列也可以在 SERVER B 的表 B 中创建新的日期列。我需要使用 SQL 作业自动将 50 个数据库表 A 从 SERVER A 加载到表 B(从表 A 中选择列)到 SERVER B。 请任何人都可以建议我如何将数据库加载作为一个循环。

谢谢。

【问题讨论】:

  • 试试Biml作为列信息......

标签: ssis


【解决方案1】:

我将向您展示如何从 DatabaseA 的 50 个表中获取所有列并使用 SSIS 将它们加载到 DatabaseB 中。那个包看起来像这样。

我将解释逻辑流程。

第一个执行 SQL 任务将从信息模式中获取表列表。

TABLE_SCHEMA|TABLE_NAME
MySchemaA   |MyTableA1
MySchemaA   |MyTableA2

我们将获取该列表并将其保存为ResultSet 变量。保存后,我们可以使用 Foreach Loop ADO Enumerator 任务遍历 ResultSet。对于每个循环,我们将把一行中的值映射到TABLE_SCHEMATABLE_NAME SSIS 变量中。然后,我们将在动态 SQL 语句中使用这些值。第二个执行 SQL 任务是从 SQLStatement 变量中获取它的命令。我们已经通过以下表达式设置了该变量...

"SELECT * INTO DatabaseB." + @[User::TABLE_SCHEMA] + "." + @[User::TABLE_NAME] +" FROM DatabaseA."+ @[User::TABLE_SCHEMA] + "." + @[User::TABLE_NAME]

所以对于每个循环,模式和表名都被注入到 SQL 语句中,并且该表是 SELECT * INTO 一个同名的目标表。

查看herehere 以获取有关如何使用 Foreach 循环 ADO 枚举器映射变量的更详细示例。

现在……

我确实读到了你想要的

从表 A 中选择列

如果您足够幸运,需要从 DatabaseA 中的 50 个表中的每一个表中获取完全相同的列集,只需将上述查询中的 * 更改为 [ColumnA],[ColumnB],[ColumnC]。如果您碰巧需要为每个表使用不同的列集,那么……这可能是有问题的。您需要创建一个TABLE_NAME | ColumnSet 列表并将其集成到您的循环中......好吧......这听起来像是很多工作!在编写代码之前,您可能可以手动完成 50 次。希望这会有所帮助!

【讨论】:

  • 嗨,我有以下数据库。我如何只需要将这些数据库列表添加到 for 循环中?请推荐我
  • 名CREATE_DATE Sales_backup_201201312300 2016年3月10日9点21 Sales_backup_201202292300 2016年3月10日9点26分Sales_backup_201203312300 2016年3月10日9时32分Sales_backup_201204302300 2016年3月10日9点38 Sales_backup_201205312300 03/10 12:25 SALES_BACKUP_2012016/2016 12:31 SAULS_BACKUP_2012012016 Sales_backup_201211302300 03/10/2016 13:48 Sales_backup_201212312300 03/10/2016 14:45
  • SAULS_BACKUP_20130 05/10/211116/20/2011 SAULS_BACKUP_201308141850 05/10/21 13:21 SAUSS_BACKUP_201308141850 05/10/2011 13:28 Sales_Backup_2013011850 05/10/21 13:28 Sales_Backup_2013011850 05/10/21 13:36 Sales_Backup_2013141850 05/10/11 13:36 Sales_Backup_2013141850 05/10/201313181850 05/10/2013131211850 05/10/20111111850 05/10/2011 13:28 sales_backup_20130911850 05/10/201113 /10/2016 13:51 Sales_backup_201312311850 06/10/2016 09:25
  • SAULS_BACKUP_201403311850 2016/09/2013:09/09/2013 14:03/2016/09/0913 SAUSS_BACKUP_201401850 2011/09/20191111111111111111111111111111111119-8111119 /10/2016 10:53 Sales_backup_201412311850 23/09/2016 13:20
  • Sales_backup_2015_05_31_230001_7137975 2016年9月9日9时23 Sales_backup_2015_06_30_203001_8647044 2016年8月9日14时58 Sales_backup_2015_07_31_203001_8009608 2016年9月9日9时40 Sales_backup_2015_08_31_203002_1718153 2016年9月9日9时17 Sales_backup_2015_09_30_203001_6301490 2016年9月9日10:11 Sales_backup_2015_10_31_203003_4130018 2016年9月9日10时35 Sales_backup_2015_11_30_203001_8901986 13/09/2016 10:26 Sales_backup_2015_12_31_203001_8001013 13/09/2016 11时57 Sales_backup_201501311850 23/09/2016 13时38 Sales_backup_201502282300 23/09/2016 13时58分23 Sales_backup_201503312300 /09/2016 14:22
【解决方案2】:

这意味着查询和目标表名都是可预测的。

您可以通过将它们的名称放入表中或从INFORMATION_SCHEMA 获取它们来循环遍历所需的表。

在此循环容器中,您可以从INFORMATION_SCHEMA 构造源查询,然后使Data Flow 中的源组件使用表达式来使用您的查询。

【讨论】:

  • 将数据库名称添加到表后,我需要如何将这些数据库放入 for 循环或每个循环容器?请指教
猜你喜欢
  • 2021-07-17
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多