是否可以避免XML配置文件并仍在SSIS中使用包配置?

时间:2011-05-30 20:09:25

标签: visual-studio-2005 ssis

我们的团队管理多个版本的dtsconfig文件,每个版本环境一个,我试图看看是否有办法避免这种情况,看看是否有更简单的方法。

我们的问题是指定在何处查找输入文件。在每个发布环境中,输入文件位于与托管包文件的服务器不同的服务器上,我怀疑这是常态。

理想情况下,我希望能够使用Environmental变量指定文件ConnectionString来指定文件夹位置,但保留文件名部分不变,如下例所示:

%FileFolder%\ MyFile.txt的。

..其中%FileFolder%等于\ OurServerName \ OurProjectName \ OurFilesFolder。

<?xml version="1.0"?>
<DTSConfiguration>
    <DTSConfigurationHeading>
        <DTSConfigurationFileInfo GeneratedBy="MyDomain\MyIDE" GeneratedFromPackageName="" GeneratedFromPackageID="" GeneratedDate="05/30/2009 01:26:00 PM" />
    </DTSConfigurationHeading>
    <Configuration ConfiguredType="Property" Path="\Package.Connections[FLAT_FILE_PLAN].Properties[ConnectionString]" ValueType="String">
        <ConfiguredValue>\\OurServerName\OurProjectName\OurFilesFolder\MyFile.txt</ConfiguredValue>
    </Configuration>
</DTSConfiguration>

3 个答案:

答案 0 :(得分:4)

这是一个可能的解决方案,您可以尝试在环境变量中指定文件夹路径并在包中使用它。此示例不使用配置文件(.dtsconfig),但它需要在正在执行程序包的计算机上设置Environment Variable名为SSISFolderPath的{​​{1}}。

分步流程:

  1. 导航至Control Panel - &gt; System - &gt; Advanced system settings - &gt;点击Advanced标签 - &gt;点击Environment Variables...按钮 - &gt;单击对话框底部的第二个New...按钮。这些步骤适用于Windows Server 2008或2008 R2。较旧的Windows服务器可能具有稍微不同的导航选项。

  2. 创建一个环境变量,如屏幕截图# 1 所示。我将其命名为SSISFolderPath,并将值c:\temp\SSISFolderPath\

  3. 注意:如果您打开Visual Studio IDE,请关闭并重新打开它,以便IDE和SSIS都可以看到环境变量设置封装

  4. 在SSIS包上,创建名为FilePath的变量,如屏幕截图# 2 所示。 Refer this link了解如何在SSIS包中创建变量。

  5. 在SSIS包上,单击菜单SSIS并选择Package Configurations...请确保在执行此操作之前单击包。否则,该选项将不可见。

  6. 选中Enable package condifurations复选框,然后点击Add...按钮。请参阅屏幕截图# 3

  7. Select Configuration Type步骤中,从下拉列表Configuration type中选择值环境变量,然后选择新创建的变量,此示例中为<下拉列表Environment variable中的strong> SSISFolderPath 。点击Next >按钮。请参阅屏幕截图# 4

  8. Select Target Property步骤中,展开Variables部分,展开变量 FilePath Properties,然后选择Properties节点下。点击Next >按钮。请参阅屏幕截图# 5

  9. Completing the Wizard步骤中,提供合适的Configuration name。我已经给出了 Environment_Variable 。点击Finish按钮。请参阅屏幕截图# 6

  10. 我在SSIS包的Control Flow选项卡上放置了Script task,只是为了证明该变量是使用Environment Variables的值填充的。请注意,该变量当前在包上没有任何值。在包执行期间调用脚本任务的下一步中,将使用在计算机上创建的Environment Variables SSIFolderPath 中的值填充变量,并将其显示在 MessageBox中。请参阅屏幕截图# 7 以获取示例输出。

  11. 希望有所帮助。

    脚本任务代码: (使用下面给出的代码替换脚本任务中的Main()方法)

    VB 可在 SSIS 2005 and above

    中使用的Main()方法代码
    Public Sub Main()
        Dim varCollection As Variables = Nothing    
    
        Dts.VariableDispenser.LockForRead("User::FilePath")
        Dts.VariableDispenser.GetVariables(varCollection)
    
        MessageBox.Show(varCollection("User::FilePath").Value.ToString())
    
        Dts.TaskResult = ScriptResults.Success
    End Sub
    

    C# Main()方法代码只能在 SSIS 2008 and above 中使用

    public void Main()
    {
        Variables varCollection = null;
        Dts.VariableDispenser.LockForRead("User::FilePath");
        Dts.VariableDispenser.GetVariables(ref varCollection);
    
        MessageBox.Show(varCollection["User::FilePath"].Value.ToString());
        Dts.TaskResult = (int)ScriptResults.Success;
    }
    

    屏幕截图#1:

    1

    屏幕截图#2: Refer this link了解如何在SSIS包中创建变量。

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:(此屏幕截图仅适用于SSIS 2005)

    8

答案 1 :(得分:1)

@Siva有一个非常好的答案,适用于不同机器上的单个环境/开发人员,但我们在实践中发现,如果您在使用环境的同一台机器上运行多个环境(Dev / UAT / Prod / etc)变量证明很难,因为你需要在子流程开始之前不断更改环境变量。

我们尝试了各种客户端的配置变体 - 只有内部具有所有配置的XML dtsConfig文件(每个环境一个) - 一个环境变量,用于控制使用哪个dtsConfig文件 - 一个最小的dtsConfig文件,指向已定义完整配置的SQL服务器/数据库/表组合。

如果我们从头开始,我现在通常会选择第三个选项,因为它对我们来说是最灵活的。

答案 2 :(得分:0)

我发现将值传递给SQL Server Agent中的变量对我来说效果很好。

我正在计划的任务上运行SSIS包,因此SQL Server作业类型是“SQL Server Integration Services包”,然后您可以在“作业步骤属性”的“设置值”选项卡上提供值。

当我在本地运行时,我的属性路径为“\ Package.Variables [User :: ChildPackagePath] .Properties [Value]”,其值为“D:\ Database \ ETL \ ETL \”(否)引用任何一个)。在各种环境中,这是不同的。

这有利有弊。缺点 -

con是任何有权访问SQL Server代理作业的人都可以看到详细信息(尽管只有那些人)。

优点是您可以编写作业脚本,并更改​​脚本中的任何值,以便在新环境中快速创建新作业。如果您愿意,也可以使用不同的“版本” - 使用不同值的不同作业使用相同的包。