将SSIS包配置应用于多个包

时间:2012-07-18 17:46:08

标签: sql sql-server-2008 ssis

我有大约85个使用相同连接管理器的SSIS包。 我知道每个包都有自己的连接管理器。 我试图根据软件包所在的服务器来确定简单地设置连接管理器的连接字符串的最佳配置方法。 我已经在线访问了各种建议,但无法在任何地方找到我可以简单地将配置从一个包复制到其余包的实践。 显然有很多方法,如XML文件,SQL Server,环境变量等。

所有文章都指出使用XML或SQL方法使用Indirect方法。为什么使用环境变量来保存连接字符串是一种不好的方法?

非常感谢任何建议。

谢谢!

1 个答案:

答案 0 :(得分:5)

为什么使用环境变量来保存连接字符串是一种糟糕的方法?

我发现环境变量或注册表项配置方法受到严重限制,因为它一次只能配置一个项目。对于连接字符串,您需要为给定服务器上的每个目录定义环境变量。也许它只有2或3而且可以管理。我们有一个很好的30+每个数据库实例,我们有多实例机器,所以你可以看到这个问题在维护噩梦中爆炸的速度有多快。与使用基于表或xml的方法进行对比,该方法可以为给定的配置键保存多个配置项。

...最佳配置方法,只需根据软件包所在的服务器设置连接管理器的连接字符串。

如果你走这条路,我建议创建一个变量ConnectionString并使用它来配置属性。这是一个额外的步骤,但我再次发现调试变量上的复杂表达式与属性上的复杂表达式相比更容易。使用变量,您始终可以在包上弹出断点并查看本地窗口以查看当前值。

创建名为ConnectionString的变量后,我右键单击它,选择Properties并将EvaluateAsExpression设置为True,将Expression属性设置为"Data Source="+ @[System::MachineName] +"\\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;"

当评估它时,它会填写当前机器的名称(DEVSQLA),并且我有一个连接到命名实例DEV2012的有效OLE DB连接字符串。

Data Source=DEVSQLA\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;

如果你有比一个变量更复杂的配置需求,那么我可以看到你使用它来配置连接管理器到一个sql表,它包含所有配置键和值的完整存储库。

...无法找到我可以简单地将配置从一个包复制到其余包的任何地方

我将通过程序化路线修改所有80个包装。我们从第三方收到了一些软件包,他们没有按照我们的配置和日志记录程序进行操作。代码并不是非常难以理解,如果您准确描述了为解决需求而进行的更改类型,我很乐意在此答案中添加一些代码。它可以像下面这样简单。在调用该函数之后,它将通过在SSISDB ole连接管理器上将sql server配置添加到名为dbo.sysdtsconfig的表中来修改包,以获取名为Default.2008.Sales的过滤器。

string currentPackage = @"C:\Src\Package1.dtsx"

public static void CleanUpPackages(string currentPackage)
{
    p = new Package();
    p.app.LoadPackage(currentPackage, null);
    Configuration c = null;

    // Apply configuration Default.2008.Sales
    // ConfigurationString => "SSISDB";"[dbo].[sysdtsconfig]";"Default.2008.Sales"
    // Name => MyConfiguration
    c = p.Configurations.Add();
    c.Name = "SalesConfiguration";
    c.ConfigurationType = DTSConfigurationType.SqlServer;
    c.ConfigurationString = @"""SSISDB"";""[dbo].[sysdtsconfig]"";""Default.2008.Sales""";

    app.SaveToXml(sourcePackage, p, null);
}

向包中添加变量不会占用太多代码。在清理过程中,添加这样的代码,在包中添加一个新变量,其中包含如上所示的表达式。

string variableName = string.Empty;
bool readOnly = false;
string nameSpace = "User";
string variableValue = string.Empty;
string literalExpression = string.Empty;

variableName = "ConnectionString";
literalExpression = @"""Data Source=""+ @[System::MachineName] +""\\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;""";

p.Variables.Add(variableName, readOnly, nameSpace, variableValue);
p.Variables[variableName].EvaluateAsExpression = true;
p.Variables[variableName].Expression = literalExpression;

如果我遗漏了任何内容,或者您​​希望澄清任何一点,请告诉我。