1

を使用してUser::PrevMonthデータ型の変数に値を代入しようとしていますが、値が設定されていません。プロパティ ペインで変数に値が設定されていません。StringScript TaskVariables

変数

スクリプト タスクがControl Flowに設定されました。スクリプト タスクのプロパティで、2 つの変数を として設定しまし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

変数ウィンドウとローカルに関する私のコメントに基づいて構築するだけです

値が設定されていないことをどのように判断していますか? ばかげた質問に思えますが、[変数] ウィンドウの変数の値は実行中に変更されません。それは設計時のことです。実際の値は、[Debug]、[Windows]、[Locals] メニューの [Locals] ウィンドウから入手できます。そこで変数を展開すると、実行時の値を調べることができます

このような単純なパッケージを考えると

単純な制御フロー、スクリプト タスクからスクリプト タスクへ

これは、パッケージ内の実際の値と、[変数] ウィンドウでまだ報告されている値を示す例です。技術的には、実際の [ローカル] ウィンドウにはすべてのシステム変数で多くの「ノイズ」があるため、これら 2 つの変数に Watch を設定します。

監視ウィンドウと変数ウィンドウ

[ローカル] ウィンドウの例

地元の窓口

したがって、Siva (現在は user756519) は、実行時にスクリプトが機能し、変数に値を正しく割り当てていることに同意しているので、パッケージに何か他の問題がある可能性があります。自分がいると思っている変数を使用していない可能性があります。

于 2013-02-13T16:34:51.730 に答える
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.

で作成された SSIS パッケージのサンプルを次に示しますBIDS 2008 R2。パッケージにはScript Task. 異なるスコープで同じ名前の 2 つの変数を宣言しましたPrevMonth

  • 最初の変数はパッケージ スコープで宣言されますSO_14857540
  • 2 番目の変数は、タスク スコープの下で宣言されますScript Task

パッケージを選択すると、変数ペインにはパッケージ スコープで宣言されたパッケージ変数のみが表示されます。

パッケージ変数

異なるスコープで宣言されたすべての変数を表示するには、プロパティ ペインの4 番目のアイコンをクリックします。Variablesツール ヒント テキストが含まれている必要がありますShow All Variables

すべての変数

ただし、これは、変数値が「変化しない」ように見える理由になる可能性があります。SO_14857540 にスコープが設定されているため、パッケージ全体に表示される PrevMonth。「スクリプト タスク」を対象とする PrevMonth。スクリプト タスクが実行されると、ローカル スコープの変数が表示されます。スクリプト タスクがローカル スコープの変数の値を変更すると、その変数がスコープ外になり、パッケージ スコープの変数だけが残ります。

于 2013-02-13T16:22:45.527 に答える