我有一个简单的String变量,其值如下:“C:\ Test.txt”。 现在我想编辑变量以指向不同的文件。 我找不到办法做到这一点。我可以更改名称,数据类型,但不能更改值本身! 我是否需要删除变量并创建新变量?
更新:问题是由“ReadOnly”属性设置为“True”引起的。对于典型情况,请参阅下面接受的答案。
答案 0 :(得分:15)
正如@Yuck和@devarc所指出的,Variable拥有两个不同且不同的值。设计时值是您首次创建变量时分配的值。在您的情况下,变量将C:\ Test.txt保存为设计时值。每次打开包时,它都会显示C:\ Test.txt,直到您在
中更改它
要在程序包运行时更改变量的值,您可以选择设置值或计算值。在这里,我创建了一个包含级变量CurrentFile
,其值为C:\ Test.txt
经常让人们兴奋的一件事是他们已经正确地改变了运行时间值,但是当他们在BIDS中运行时,他们看到了“旧”值。在变量执行期间,“变量”窗口中显示的值不会更改。
在包执行期间,我的变量窗口仍显示设计时值(C:\ Test.txt),但真实值反映在Locals窗口(C:\ Test2.txt)
SSIS中大多数内容的价值都可以通过一组详细的command-line options或configuration来源在运行时建立。我认为最大的不同是这种方法是值始终是包执行的整个生命周期的值。程序包的顺序或并行调用可以更改该值,但对于 执行,该值将保持不变(禁止显式修改该值。
命令行执行(dtexec.exe),右键单击包并从文件系统(dtexecUI.exe)运行或创建SQL Server Integration Services的SQL代理作业步骤都允许通过命令行执行提供运行时值SET命令。使用上面的变量,以下命令会将运行时值设置为C:\Test2.txt
dtexec /file C:\Generated.dtsx /set \Package.Variables[User::CurrentFile].Properties[Value];"C:\Test2.txt"
SSIS提供了一个选项来创建配置源,以便为包提供运行时值。我上面链接的文章在描述配置选项的优缺点方面比我在这里做的要好得多。我会说我通常使用两者 - 我的SET命令配置一个连接管理器,然后由包用来查找“完整”的包配置集。
SSIS中有多种任务可以更改变量的值以及使用表达式来更改值。我认为这些是在包裹飞行时按价值运作的东西。
脚本任务是最常用的机制之一,但我发现SSIS工具包中的其他工具通常更适合更改变量值。
Foreach Loop Container和Execute SQL Task是您应该考虑分配变量值的其他两个重要任务。
表达式是SSIS工具箱中最辉煌的糖果。 SSIS中的大多数“事物”都会公开配置属性。这很有帮助,但是使用赋值表达式来构建这些属性非常出色。
例如,假设3个变量RootFolder
,FileName
和ComputedCurrentFile
的值为C:\,File2.txt和空字符串。在ComputedCurrentFile
的“属性”窗口中,我们将EvaluateAsExpression的值从False更改为True,然后使用类似@[User::RootFolder]+ "\\" +@[User::FileName]
的表达式,它只是将前两个变量的值连接在一起。如果处理的文件名是标准的但源文件夹经常更改,这可能会有所帮助。或者,如果我们讨论输出,通常使用表达式来使用日期和可能的包运行时间来构建输出文件名。
最后,没有什么可以阻止这些方法的混合和匹配。我通常使用配置将文件枚举器指向正确的起始文件夹,然后使用计算值来标识当前文件以进行处理。
答案 1 :(得分:8)
如果您想在设计师中更改它,只需右键单击可用空间即可 - >>变量
但是如果你想在运行时更改它,我建议你:
例如在VB中:
Dts.Variables(“myVariable”)。值= @“C:\ Test2.txt”;
Dts.TaskResult = ScriptResults.Success
答案 2 :(得分:-1)
我也面临着与您相同的问题,一旦在SSIS变量窗口中声明并定义了变量(例如:var1 = text1.csv),我就无法更新变量值(例如:var1 = text2 .csv)在SSIS变量窗口中,只需点击变量值字段即可。
应用于以下修复:- 我注意到我使用表达式构建器将var1变量用作表达式,以便更新值(例如:-var1 = text2.csv)。我使用了表达式构建器窗口。使用表达式构建器完成后,您可以看到text2 .csv已映射到var1。