1

我正在尝试为User::PrevMonth数据类型String的变量赋值,Script Task但没有设置任何值。该变量尚未在Variables属性窗格中设置为任何值。

变量

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

脚本任务编辑器

这是我的脚本任务代码:

/*
   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来查看变量值,它们正在显示正确的输出。

4

3 回答 3

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. 该包有一个Script Task. 我在不同的范围内声明了两个变量,但名称相同PrevMonth

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

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

包变量

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

所有变量

但是,这可能是变量值“不”发生变化的原因。PrevMonth 范围为 SO_14857540,因此对整个包可见。范围为“脚本任务”的 PrevMonth。当脚本任务执行时,本地范围的变量将是可见的。您的脚本任务将更改本地范围变量的值,然后变量超出范围,只保留包范围变量。

于 2013-02-13T16:22:45.527 回答
3

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

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

给定一个像这样简单的包

简单的控制流,脚本任务到脚本任务

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

观察与变量窗口

局部变量窗口的示例

当地人窗口

因此,我看到并且我认为 Siva(现在的 user756519)同意您的脚本正在运行并在运行时正确地将值分配给变量,因此您的包中可能还有其他问题。可能是您没有使用您认为的那些变量。

于 2013-02-13T16:34:51.730 回答
0

今天遇到这样的问题,我发现如果变量有一个表达式(在我的例子中,它是脚本任务在某些情况下更改的默认值),表达式总是会覆盖您写入变量的任何内容:删除表达式和脚本任务正确设置值。

于 2018-12-11T17:10:08.690 回答