【问题标题】:Setting a variable value using a Script Task in SSIS在 SSIS 中使用脚本任务设置变量值
【发布时间】:2023-01-09 03:50:57
【问题描述】:

使用脚本任务,我试图将变量 A 的值设置为变量 B 的值。两者都在同一个包中。 这是我使用的代码:

public void Main() {

              Dts.Variables["User::VariableA"].Value =     Dts.Variables["User::VariableB"].Value;


        Dts.TaskResult = (int)ScriptResults.Success;
    }

两个变量都是字符串类型,并标记为读/写。我也尝试使用 ToString() 方法将它们转换为脚本中的字符串,但效果不佳。

任何人都知道我错过了什么?

【问题讨论】:

    标签: c# sql visual-studio ssis business-intelligence


    【解决方案1】:

    你什么都没错过。或者,您可能在这里过于简化了问题,因为最小复制不会显示相同的行为

    我创建了一个包,如图所示。两个字符串变量,变量 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),在变量名称旁边以及数据类型和值的浅灰色文本。

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多