2014-09-25 129 views
0

我有关于ssis包的问题。我想在运行我的ssis包时动态地填充一个变量。该变量应该是正在执行的当前步骤/任务的连接字符串。例如,如果我有一个包含两个步骤的ssis包,则第一步的连接是Server1DB1,第二步的连接是Server2DB2。当我在运行程序包时,第一步忙于执行变量应该是Server1DB1,一旦完成并且第二步正在执行,变量应该是Server2DB2。我试图找到答案,但所有文章都讲述了如何根据变量改变连接,而不是反之。任何帮助都感激不尽。提前感谢你。如何从connectionstring ssis设置变量

+0

动态部分在哪里起作用?任务A在Server1DB1上执行某些操作,任务B在Server2DB2上执行某些操作 – billinkc 2014-09-25 13:41:38

+0

嗯,也许我使用了错误的单词......但是在运行时,当每个步骤都在执行时,变量会被更新/更改为正在执行的当前步骤/任务的连接。 – 2014-09-25 13:44:29

+1

我还没有“明白”。任务A在Server1B1上执行X.该执行的结果是否以任何方式确定执行任务B的位置? – billinkc 2014-09-25 13:46:18

回答

0

在脚本任务中,从Dts.Connections获取ConnectionManager的适当连接,然后将其ConnectionString属性分配给ReadWrite变量。

如果ConnectionString由表达式设置,则需要让连接管理器获取连接,以便使用表达式的当前值更新ConnectionString属性。

例如:

public void Main() 
    { 
     // Where "MyOLEDBConn" is the connection's name 
     var connectionManager = Dts.Connections["MyOLEDBConn"]; 

     // AcquireConnection/ReleaseConnection is unnecessary if ConnectionString isn't set by an expression 
     var rawConnection = connectionManager.AcquireConnection(Dts.Transaction); 

     // "User::ConnectionString" is configured as a ReadWrite variable for the Script Task 
     Dts.Variables["User::ConnectionString"].Value = connectionManager.ConnectionString; 

     connectionManager.ReleaseConnection(rawConnection); 

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 

任务获取连接字符串的当前值的基础上,其表达,因此它需要在表达式的值是相同的,因为它要在一个点执行当被记录的任务获得了连接时。这个任务可能直接放在你想要记录的每一步之前或之后,或者(更好的是)在事件处理程序之前或之后执行。

一种替代

另一种方法将是使用表达式任务配置连接字符串,并将其分配给一个变量。连接(通过表达式)和您的日志记录过程都可以使用此变量,从而无需从ConnectionManager中获取连接字符串。这将消除对上述脚本任务的需要。

+0

嗨,谢谢你的回答。只是一个问题什么是MyOLEDBConn?我在那里使用哪个连接名称? – 2014-09-29 09:23:23

+0

@LiamDomingo,将“MyOLEDBConn”替换为您的连接名称。您可以在创建连接时选择该名称。 – 2014-09-30 12:58:32

+0

连接是一个普通的SSIS连接,就像创建任何其他SSIS连接一样。 – 2014-09-30 14:03:42