为什么Script Task代码没有为ReadWriteVariables分配任何值?

时间:2013-02-13 15:55:50

标签: ssis

我正在尝试使用 User::PrevMonth <为数据类型 String 的变量 Script Task 分配值/ em>但没有设置任何值。该变量尚未在 Variables 属性窗格中设置任何值。

Variables

我的控制流中已设置了我的脚本任务。在脚本任务的属性中,我将两个变量设置为 ReadWriteVariables 。另一个变量似乎工作正常,它们被声明为 Int32

Script Task Editor

这是我的脚本任务代码:

/*
   Microsoft SQL Server Integration Services Script Task
   Write scripts using Microsoft Visual C# 2008.
   The ScriptMain is the entry point class of the script.
*/

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;

namespace ST_7206cd3a4d734228b8d6860bdb6a59c9.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion
        public void Main()
        {
            //This will get the year as an int (e.g. 2013)
            DateTime dLastYear = DateTime.Today.AddYears(-1);
            int iLastYear = dLastYear.Year;

            //This will get the month as an str (e.g. 04)
            DateTime dLastMonth = DateTime.Today.AddMonths(-1);
            string sLastMonth = dLastMonth.ToString("MM");

            //Assign variables back to SSIS package
            Dts.Variables["User::PrevMonth"].Value = sLastMonth;
            Dts.Variables["User::Year"].Value = iLastYear;

            //Return package success
            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

具有String数据类型的变量在成功执行包后不会更改其值。这真让我烦恼,我觉得我已经检查了一切。

有人能发现我失踪的东西吗?我猜这是非常愚蠢/明显的事情。

更新

我在Message Box中使用 Script Task 来查看变量值,并显示正确的输出。

3 个答案:

答案 0 :(得分:3)

如何在BIDS

中查看在多个包范围内声明的变量

这是对您的评论的回复, not 是对您问题的回答。

How do I check for two copies of variables being defined? 
I did delete the variable and re-add. I've screenshotted my variable window.

以下是在 BIDS 2008 R2 中创建的示例SSIS包。该软件包有一个 Script Task 。我在不同的范围内声明了两个变量,但名称相同 PrevMonth

  • 第一个变量在包范围 SO_14857540
  • 下声明
  • 在任务范围 Script Task
  • 下声明第二个变量

选择包后,变量窗格将仅显示在包范围下声明的包变量。

Package variable

要查看在不同范围下声明的所有变量,请单击 Variables 属性窗格中的第四个图标。它应该有工具提示文字 Show All Variables

All variabls

然而,这个可能成为变量值“不”改变的原因。 PrevMonth,其范围为SO_14857540,因此对整个包可见。作为“脚本任务”范围的PrevMonth。执行脚本任务时,将显示本地范围的变量。您的脚本任务将更改本地范围的变量的值,然后 变量超出范围,并且只保留包范围变量。

答案 1 :(得分:3)

简单地建立我对变量窗口与本地人的评论

  

您如何确定未设置值?似乎是   愚蠢的问题,我知道变量中变量的值   窗口在执行期间不会改变。那是设计时间的事情。   实际值可从Debug的Locals窗口获得,   Windows,本地菜单。在那里展开变量然后你可以检查   运行时值

给出一个像这个简单的包

simple control flow, script task to script task

这是一个示例,显示了我的包中的实际值与“变量”窗口中报告的仍然的值。从技术上讲,我在这两个变量上设置了一个监视器,因为实际的Locals窗口中包含所有系统变量的很多“噪音”。

watch versus variables window

“本地”窗口的示例

Locals window

所以,我看到并且我认为Siva(现在是用户756519)同意你的脚本正在运行并且在运行时正确地将值分配给变量所以也许你的包中还有其他东西是不对的。可能是您没有使用您认为自己的变量。

答案 2 :(得分:0)

今天遇到这样的问题,我发现如果变量具有表达式(在我的情况下,脚本任务在某些情况下是默认值),那么表达式始终会覆盖您正在写入的内容。变量:删除表达式,脚本任务会正确设置该值。