【问题标题】:ssis - using Foreach to read from multipe dbsssis - 使用 Foreach 从多个数据库中读取
【发布时间】:2026-01-24 07:00:01
【问题描述】:

目前,我有一个连接到 20 多个 dbs(相同结构)的控制流

在这个控制流中,除了与 db 的连接不同的数据流之外,一切都是相同的。 这是数据流的示例:

OLE DB Source 实际上是不同的。

在这种情况下是否可以使用 Foreach 循环来避免这些重复? 如果可能,该怎么做?我找不到任何描述如何连接到不同数据库的好文章。

谢谢,
伊利亚

编辑:
我发现一篇文章描述了我需要的大部分内容:http://sql-bi-dev.blogspot.com/2010/07/dynamic-database-connection-using-ssis.html

我遵循了此处的所有步骤,但我不了解查询的一部分。这是来自那篇文章的查询:

SELECT '' TableName, N'' ConnString, 0 RecordCount, GETDATE() ActionTime

我不明白这个语法,我猜这是错误的来源:

[OLE DB 源 1] 错误:输出列出错 输出“OLE DB 源输出”(11) 上的“ConnString”(37)。专栏 返回的状态是:“文本被截断或一个或多个字符 目标代码页中没有匹配项。”。

[OLE DB 源1] 错误:“输出列“ConnString”(37)” 由于发生截断而失败,并且截断行处置 在“输出列“ConnString”(37)”上指定截断失败。 指定对象的指定对象发生截断错误 组件。

[SSIS.Pipeline] 错误:SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。这 组件“OLE DB 源”(1) 上的 PrimeOutput 方法返回错误 代码 0xC020902A。组件返回失败代码时 管道引擎称为 PrimeOutput()。故障码的含义 由组件定义,但错误是致命的并且管道 停止执行。在此之前可能会发布错误消息 提供有关失败的更多信息。

我想从名为 Agency 的表中获取数据(我在变量 SourceTable = 'Agency' 中定义 - 如果我设置了不存在的表然后我得到错误,所以我猜到 Source DB 的连接是好的).. .它让我感到困惑,我没有在任何地方定义我需要的列,所以我猜这个查询中有一个错误,但我不明白它的语法。有什么建议吗?

编辑 2:
我遇到的另一个问题是消息框总是在连接字符串中返回相同的值 - 变量 ConnString 不会改变。如何将 SourceList 变量中的值分配给它?

【问题讨论】:

    标签: loops ssis foreach


    【解决方案1】:

    我认为这是可能的。我会这样做:

    1. Foreach 循环的集合应该是“Foreach 项目枚举器”。此时在 Enumerator Configuration 面板中,您可以制作一个小表格。添加带有类型字符串的列。这里将出现数据库的连接字符串。
    2. 创建一个字符串变量并将其与该列关联:转到 Foreach 循环编辑器中的变量映射,选择字符串变量(例如 User::ConnString),指定索引 0。循环将遍历您首先设置的条目步骤,您可以通过这个 User::ConnString 变量访问这些值。
    3. 将数据流任务添加到 Foreach 循环容器中。里面设置了一个OLE DB Source。它需要一个连接管理器。选择与 OLE DB 连接关联的连接管理器,转到属性、表达式。选择 ConnectionString 属性,然后在表达式列中键入 @[User::ConnString](或使用您的变量名)。
    4. 找到您当前使用的所有连接字符串并将它们键入到枚举项中。

    我认为通过这些步骤可以简化数据流。

    此过程假定您在所有数据库中具有相同的表名。在其他情况下,您还可以迭代要连接的表名。 (枚举配置中的第二列并用适当的表名填充单元格。您还需要第二个变量。)

    当然,您不必复制整个连接字符串,而是复制其中的更改部分。在这种情况下,你应该适当地表达你的表达方式。

    编辑

    你是对的。这个例子有一些问题。 (我觉得你的解决方案有点复杂,但是可以用。)

    第一个是(正如你提到的)它没有将值传递给变量。我将使用这些完成第 6 步:将 User::SourceList 设置为 ADO 对象源变量后,选择左侧的变量映射。在变量列中首先选择 User::ConnString(将索引设置为 0),然后选择 User::SourceTable 第二个(将索引设置为 1)。这将解决您使用 MessageBox 进行的第二次编辑。从现在开始,它应该显示正确的值。

    第二个问题是你写的这个截断错误。如果您仔细查看错误消息,他们会说某些字符串列的长度为 1。这就是发生某些截断的原因。要解决此问题,请右键单击 OLE DB 源,选择显示高级编辑器。转到最后一个选项卡(输入和输出属性),展开 OLE DB 源输出/输出列。首先选择表名。在右侧,在 Data Type Properties 中,您应该看到 Lenght = 1。(我猜 SSIS 无法正确确定此列的长度,因为您选择 SQL 命令变量作为数据访问模式)。根据 Result 表定义,将此值设置为 128。同时将 ConnString 列的长度从 1 更改为 256。

    在这些更改之后,示例应该可以工作。 (在我的例子中它起作用了。)这个例子使用了和我写的差不多的概念,只是它从数据存储中获取连接字符串,而不是从包本身内部。我接受前者可能是一个更强大的解决方案。我希望你能让你的包工作。如果没有,请告诉我。

    【讨论】:

    • 您好,我已经编辑了我的问题,您可以检查一下吗?谢谢!
    • 它可以工作,同时我认为这些查询不是我需要的,所以我自己写了,但这部分变量映射正是我所需要的。谢谢!!