【问题标题】:Is it possible to avoid XML config files and still use package configuration in SSIS?是否可以避免 XML 配置文件并仍然在 SSIS 中使用包配置?
【发布时间】:2011-05-30 20:09:24
【问题描述】:

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

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

理想情况下,我希望能够使用环境变量指定文件 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>

【问题讨论】:

  • 并非如此。请在“理想”一词之后设置我的更新定位。显然我的整个消息没有发布。谢谢

标签: visual-studio-2005 ssis


【解决方案1】:

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

分步过程:

  1. 导航到Control Panel --> System --> Advanced system settings --> 点击Advanced 标签 --> 点击Environment Variables... 按钮 --> 点击第二个New... 对话框底部的按钮。这些步骤适用于 Windows Server 2008 或 2008 R2。旧版 Windows Server 的导航选项可能略有不同。

  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 下拉列表中选择值环境变量 并选择新创建的变量,在此示例中为SSISFolderPath,来自下拉列表 Environment variable。单击Next &gt; 按钮。请参阅屏幕截图 #4。

  8. 在Select Target Property 步骤中,展开Variables 部分并展开变量FilePath 的Properties 并选择Properties 下的Value节点。单击Next &gt; 按钮。请参阅屏幕截图 #5。

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

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

希望对您有所帮助。

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

VBSSIS 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# 只能在SSIS 2008 and above中使用的Main()方法代码 .

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:

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

截图#3:

屏幕截图 #4:

屏幕截图 #5:

屏幕截图 #6:

截图#7:

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

【讨论】:

  • 感谢您的详细回答。作为一名 SSIS 新手,我将 Script Task iobject 添加到 Designer 表面,进入编辑模式,从左侧导航中选择“脚本”并单击“设计脚本...”按钮,然后...什么也没发生。我期待将您提供的脚本粘贴到那里。我有安装问题还是遗漏了什么?更正:实际上-确实发生了一些事情-当单击“编辑 Scipt..”按钮时,我离开了编辑模式!模式
  • 您是否看到我的评论,其中我提到我似乎遇到了“编辑脚本...”按钮的问题?
  • 对不起,按钮文字是“Design Script..”,我错了。单击它会关闭当前对话框并且不会打开任何新对话框......任务栏上没有任何内容,后面没有窗口。我想我有一个次要问题(通常的“切线切线”..)当这个第二个问题得到解决时,我会评估你有趣的答案。非常感谢您的意见!
  • 我安装了一些服务包,现在按钮可以工作,我正在尝试输入 VB 代码...最后一行代码的完整参考是什么,(Dts.TaskResult = ScriptResults.成功)?我需要引用一些外部 DLL 吗?
  • 抱歉这么需要:在截图 2 中,如何创建范围变量:EnvVariable?"
【解决方案2】:

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

我们已经为不同的客户端尝试了一些配置变体 - 仅包含所有配置的 XML dtsConfig 文件(每个环境一个) - 控制使用哪个 dtsConfig 文件的环境变量 - 指向已定义完整配置的 SQL 服务器/数据库/表组合的最小 dtsConfig 文件。

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

【讨论】:

    【解决方案3】:

    我发现将值从 SQL Server 代理传递到变量对我来说效果很好。

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

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

    这有利有弊 -

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多