我正在尝试编写从许多相同服务器收集数据到中央存储库的 ETL。我要做的是编写一个以源地址、用户 ID 和密码为参数的包,并在每个要复制的服务器上执行一次包。
这是可行的吗?如何使用参数创建源?
我正在尝试编写从许多相同服务器收集数据到中央存储库的 ETL。我要做的是编写一个以源地址、用户 ID 和密码为参数的包,并在每个要复制的服务器上执行一次包。
这是可行的吗?如何使用参数创建源?
我的意思是问如何参数化连接管理器(这甚至是一个真实的词吗?),而不是存储连接参数的位置。答案很简单:
您可以将参数存储在表中。使用 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
完整列表在这里。