3

我正在尝试编写从许多相同服务器收集数据到中央存储库的 ETL。我要做的是编写一个以源地址、用户 ID 和密码为参数的包,并在每个要复制的服务器上执行一次包。

这是可行的吗?如何使用参数创建源?

4

2 回答 2

9

我的意思是问如何参数化连接管理器(这甚至是一个真实的词吗?),而不是存储连接参数的位置。答案很简单:

  1. 为服务器、数据库、用户 ID 和密码创建包参数
  2. 创建连接管理器作为定义数据流组件的一部分
  3. 定义连接后,右键单击封装设计屏幕底部的连接管理器并选择“参数化”。
  4. 在属性下拉列表中选择“ServerName”
  5. 如果跳过第 1 步,请选择“使用现有参数”或创建新参数
  6. 如果使用现有参数,请从下拉列表中选择它
  7. 单击确定保存(必须在每个参数后进行)
  8. 对其余参数重复步骤 4-7
于 2013-06-07T14:17:57.713 回答
1

您可以将参数存储在表中。使用 sql 任务查询表并将结果存储在对象变量中。然后,您可以在 for 循环中使用此变量。使用 SSIS 中的表达式在每次循环迭代期间更改连接的值。

有几 本书概述了这种方法。这是一个代码示例


这里有一些步骤 - 希望我没有错过任何东西。您提到了服务器“地址”,但我不确定您到底要做什么。此示例查询多个 sql 服务器。

您创建变量,SQL_RS 与对象类型,SRV_Conn 与字符串类型。这包含我的服务器名称。在执行 SQL 任务中,我有一个查询,它返回我要查询的 sql 服务器的名称。然后设置以下属性:

SELECT     RTRIM(Server) AS servername
FROM         ServerList_SSIS
WHERE     (Server IS NOT NULL)
and coalesce(exclude,'0') <> 'True' 
and IsOracle is Null

执行 SQL 任务 > 常规 > ResultSet = "Full Result Set"

执行 SQL 任务 > 结果集选项卡“结果集名称 = 0”,变量名称 =“用户::SQL_RS”

所以我们现在在 SQL_RS 变量中有一个服务器名称列表。

ForEach > 集合 > 枚举器 = "Foreach ADO 枚举器"

ForEach > 集合 > 枚举器配置 > ADO 对象源变量 = User::SQL_RS

这会将 SQL_RS 对象的第一列映射到 SRV_Conn 变量,因此循环的每次迭代都会在该变量中产生一个新值。

ForEach > 变量映射 > 变量 = User::SRV_Conn,索引 = 0

ForEach 内部还有其他一些 sql 执行程序,对 sql 数据库执行查询,因此我需要更改“MultiServer”连接的 ServerName。我有另一个用于初始查询的连接,它让我获得了要查询的服务器列表。使连接动态化是在连接的属性中完成的 - 右键单击​​连接 > 属性。单击表达式右侧的省略号。

连接 > 属性 > 表达式 > 属性 = ServerName,表达式 = "@[User::SRV_Conn]"

注意:变量映射的索引值 0 适用于 Native OLEDB\SQL Server Native Client。如果您使用另一个数据库提供程序,您可能需要使用其他索引类型 - 这会使设置更加混乱。

OLEDB = 0,1
ADO.NET = @Varname
ADO = @Param1, Param2
ODBC = 1,2

完整列表在这里

于 2013-06-05T21:10:01.177 回答