我在SQLServer 2008 R2上的SSIS中有一个脚本组件,它需要能够写入读写变量以生成平面文件导出的文件名。我创建了一个包级别变量来保存文件名,并设置平面文件连接以使用包含变量的表达式。
我有一个脚本组件,除其他外,在post execute方法中动态构建文件名。我已将变量设置在脚本组件的ReadWriteVariables设置中。
如果变量中没有默认值,则包会立即失败,因为平面文件连接管理器会尝试计算表达式以设置目标文件。所以,我只是输入了一个占位符文件名。
问题是现在它总是使用占位符文件名而不是脚本指定的文件名。确保我可以写入这些变量的最佳方法是什么?我尝试过Variables.VariableName =“value”,我也尝试过使用VariableDispenser和this.ReadWriteVariables [“VariableName”]。value,并且它们都没有持久保存我在脚本中设置的值。
答案 0 :(得分:1)
以下是一种可以在Script Component
内的Data Flow Task
内为包变量赋值的方法。
我尝试将变量锁定在Script Task
或Script Component
中,而不是在“属性”对话框中指定它们。我觉得这更容易维护。
在下面的示例中,我有一个名为 FileName 的包变量,并且该变量在脚本组件中被赋值为C:\Temp\PathChanged
。
我认为脚本组件可能不是操作包变量值的正确位置,例如文件名,但这又取决于你想要做什么。
希望有所帮助。
/* Microsoft SQL Server Integration Services Script Component
* Write scripts using Microsoft Visual C# 2008.
* ScriptMain is the entry point class of the script.*/
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void PreExecute()
{
base.PreExecute();
}
public override void PostExecute()
{
base.PostExecute();
IDTSVariables100 varCollection = null;
this.VariableDispenser.LockForWrite("User::FileName");
this.VariableDispenser.GetVariables(out varCollection);
varCollection["User::FileName"].Value = @"C:\Temp\PathChanged";
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
}
}