你什么都没错过。或者,您可能在这里过于简化了问题,因为最小复制不会显示相同的行为
我创建了一个包,如图所示。两个字符串变量,变量 A 和变量 B。它们被初始化为“My Value is A”和“My Value is B”。我通过将当前变量打印到输出窗口来确认这一点。然后我使用您的代码更新 A 的值。然后我重复使用相同的检查代码并查看两个变量的预期最终值“My Value is B”。
SCR 回波值
这是同一个脚本任务,在我更新值之前和之后。它只是将读/写变量发送到信息事件,以便它们显示在结果/输出选项卡上
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_5e898ddfc3e24549a581a83a3cabab4d
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
bool fireAgain = false;
foreach (var item in Dts.Variables)
{
Dts.Events.FireInformation(0, "SCR Echo Back", string.Format("{0}->{1}", item.QualifiedName, item.Value), "", 0, ref fireAgain);
}
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
SCR 将 B 分配给 A
这是提供的代码
using System;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
namespace ST_3a3b3c73d21c472aba3c2ddbad1481b1
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
public void Main()
{
Dts.Variables["User::VariableA"].Value = Dts.Variables["User::VariableB"].Value;
Dts.TaskResult = (int)ScriptResults.Success;
}
enum ScriptResults
{
Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
};
}
}
还能是什么呢?
找错地方
变量窗口显示包的 Design-Time 值。也许您认为该变量没有被更新,因为您正在查看该值。
相反,如果您有断点或其他东西,请查看变量下的本地窗口,这将显示当前 Run-Time 值是什么
表达你自己
有一种表情在起作用。变量上的表达式将始终取代分配的值。它不会在尝试分配给 Value 属性时引发错误,但它不会“坚持”,因为 EvalateAsExpression 属性为真意味着 Value 始终基于 Expression 属性计算。
在较新版本的 BIDS/SSDT 中,它们通过视觉提示使这一点变得更加明显。属性可通过 F4 访问,但变量窗口现在显示一个字形 f(x),在变量名称旁边以及数据类型和值的浅灰色文本。