我正在尝试编写ETL,它将来自许多相同服务器的数据收集到中央存储库中。我要做的是写一个包含源地址,用户ID和密码作为参数的包,每个服务器执行一次包复制。
这可行吗?如何使用参数创建源?
答案 0 :(得分:9)
我想问一下如何参数化连接管理器(即使是一个真正的单词?),而不是存储连接参数的位置。答案很简单:
答案 1 :(得分:1)
您可以在表格中存储参数。使用sql任务查询表并将结果存储在对象变量中。然后,您可以在for循环中使用此变量。在每次循环迭代期间,使用SSIS中的表达式更改连接的值。
Several books概述了这种方法。这是代码example。
以下是一些步骤 - 希望我没有错过任何东西。你提到服务器“地址”,但我不确定你到底想要做什么。此示例查询多个sql服务器。
您可以创建变量,带有对象类型的SQL_RS,带有string类型的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任务&gt;一般&gt; ResultSet =“完整结果集”
执行SQL任务&gt;结果集选项卡“结果集名称= 0”,变量名称=“用户:: SQL_RS”
所以我们现在在SQL_RS变量中有一个服务器名列表。
ForEach&gt;收集&gt; Enumerator =“Foreach ADO Enumerator”
ForEach&gt;收集&gt; “枚举器配置”&gt; ADO对象源变量= User :: SQL_RS
这会将SQL_RS对象的第一列映射到SRV_Conn变量,因此循环的每次迭代都会在此变量中生成一个新值。
ForEach&gt;变量映射&gt;变量= User :: SRV_Conn,Index = 0
ForEach内部是其他一些sql高管,在sql数据库上执行查询,所以我需要更改我的'MultiServer'连接的ServerName。我有一个初始查询的另一个连接,它让我得到要查询的服务器列表。使连接动态化在连接的属性中完成 - 右键单击连接&gt;属性。单击表达式右侧的省略号。
连接&gt;属性&gt;表达式&gt; Property = ServerName,Expression =“@ [User :: SRV_Conn]”
注意:变量映射的索引值0适用于Native OLEDB \ SQL Server Native Client。如果您正在使用其他数据库提供程序,则可能需要使用其他索引类型 - 这会使设置更加混乱。
OLEDB = 0,1
ADO.NET = @Varname
ADO = @Param1, Param2
ODBC = 1,2
完整列表here。