我们的团队管理多个版本的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>
答案 0 :(得分:4)
这是一个可能的解决方案,您可以尝试在环境变量中指定文件夹路径并在包中使用它。此示例不使用配置文件(.dtsconfig
),但它需要在正在执行程序包的计算机上设置Environment Variable
名为SSISFolderPath
的{{1}}。
分步流程:
导航至Control Panel
- &gt; System
- &gt; Advanced system settings
- &gt;点击Advanced
标签 - &gt;点击Environment Variables...
按钮 - &gt;单击对话框底部的第二个New...
按钮。这些步骤适用于Windows Server 2008或2008 R2。较旧的Windows服务器可能具有稍微不同的导航选项。
创建一个环境变量,如屏幕截图# 1 所示。我将其命名为SSISFolderPath
,并将值c:\temp\SSISFolderPath\
注意:如果您打开Visual Studio IDE
,请关闭并重新打开它,以便IDE和SSIS都可以看到环境变量设置封装
在SSIS包上,创建名为FilePath
的变量,如屏幕截图# 2 所示。 Refer this link了解如何在SSIS包中创建变量。
在SSIS包上,单击菜单SSIS
并选择Package Configurations...
请确保在执行此操作之前单击包。否则,该选项将不可见。
选中Enable package condifurations
复选框,然后点击Add...
按钮。请参阅屏幕截图# 3 。
在Select Configuration Type
步骤中,从下拉列表Configuration type
中选择值环境变量,然后选择新创建的变量,此示例中为<下拉列表Environment variable
中的strong> SSISFolderPath 。点击Next >
按钮。请参阅屏幕截图# 4 。
在Select Target Property
步骤中,展开Variables
部分,展开变量 FilePath 的Properties
,然后选择值在Properties
节点下。点击Next >
按钮。请参阅屏幕截图# 5 。
在Completing the Wizard
步骤中,提供合适的Configuration name
。我已经给出了 Environment_Variable 。点击Finish
按钮。请参阅屏幕截图# 6 。
我在SSIS包的Control Flow选项卡上放置了Script task
,只是为了证明该变量是使用Environment Variables
的值填充的。请注意,该变量当前在包上没有任何值。在包执行期间调用脚本任务的下一步中,将使用在计算机上创建的Environment Variables
SSIFolderPath 中的值填充变量,并将其显示在 MessageBox中。请参阅屏幕截图# 7 以获取示例输出。
希望有所帮助。
脚本任务代码: (使用下面给出的代码替换脚本任务中的Main()方法)
VB 可在 SSIS 2005 and above
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:
屏幕截图#2: Refer this link了解如何在SSIS包中创建变量。
屏幕截图#3:
屏幕截图#4:
屏幕截图#5:
屏幕截图#6:
屏幕截图#7:
屏幕截图#8:(此屏幕截图仅适用于SSIS 2005)
答案 1 :(得分:1)
我们尝试了各种客户端的配置变体 - 只有内部具有所有配置的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代理作业的人都可以看到详细信息(尽管只有那些人)。
优点是您可以编写作业脚本,并更改脚本中的任何值,以便在新环境中快速创建新作业。如果您愿意,也可以使用不同的“版本” - 使用不同值的不同作业使用相同的包。