3

OK... 比較的単純な SSIS パッケージ (DTSDesigner100、Visual Studio 2008 バージョン 9.0.30729.4462 QFE、.NET Framework 3.5 SP1) があります。パッケージの SSIS 制御フローの最後に、ファイルの名前変更操作であるファイルシステム タスクがあります。

このファイル システム タスクのプロパティは次のとおりです。

  • IsDetinationPathVariable: True
  • DestinationVariable: ユーザー::出力ファイル名
  • OverwriteDestination: True
  • 説明: ファイル システム タスク
  • 操作: ファイルの名前を変更
  • IsSourcePathVariable: False
  • SourceConnection: Excel テンプレートのコピー先

定義された表現はありません。ご覧のとおり、宛先は変数 User::OutputFileName として割り当てられています。それでは、その変数を見てみましょう...

  • 名前: 出力ファイル名
  • 範囲: パッケージ
  • データ型 (ValueType): 文字列
  • 価値:
  • 名前空間: ユーザー
  • EvaluateAsExpression: True
  • 読み取り専用: 偽
  • 式: (下記参照)

.

"\\\\SERVER\\Folder\\" + "MyAwesomeExcelWorkbook_"
+ (DT_WSTR,4)DATEPART("year", GETDATE())+ "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("mm", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("dd", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("hh", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("mi", GETDATE()), 2) + "-"
+ RIGHT("0" + (DT_WSTR,2)DATEPART("ss", GETDATE()), 2)
+ ".xlsx"

したがって、この式を正常に評価できます。パッケージが実行される (および失敗する) たびに、その値は、予想どおり、評価された式の値になります。

パッケージを実行すると、次のようになります...

  1. 前の手順は正常に実行されます。
  2. ファイル システム タスクが開始され、ファイルの名前が正常に変更されます。
  3. ただし、ファイル システム タスクが次のエラーで失敗するため、パッケージは失敗します。

.

Error: 0xC001F009 at Package: The type of the value being assigned to variable "User::OutputFileName" differs from the current variable type. Variables may not change type during execution. Variable types are strict, except for variables of type Object.
Task failed: Rename Excel Workbook
Error: 0xC0019001 at Rename Excel Workbook: The wrapper was unable to set the value of the variable specified in the ExecutionValueVariable property.
Warning: 0x80019002 at Package: SSIS Warning Code DTS_W_MAXIMUMERRORCOUNTREACHED.  The Execution method succeeded, but the number of errors raised (4) reached the maximum allowed (1); resulting in failure. This occurs when the number of errors reaches the number specified in MaximumErrorCount. Change the MaximumErrorCount or fix the errors.
SSIS package "Package.dtsx" finished: Failure.

ここで私が忘れているいくつかの細かい詳細があるようです。ここで、式全体を DT_WSTR,512 としてキャストしてみました。これは正常に評価されますが、ファイル システム タスクは同じエラーで失敗します。

私が見落としている詳細を指摘できる人はいますか? 前もって感謝します。

4

6 に答える 6

8

私も同じエラーに遭遇しました。「SQL 実行タスク」を使用してストアド プロシージャを実行し、そこから単一行の結果セット値を使用して SSIS パッケージ変数を設定していました。ストアド プロシージャの変数は「varchar(max)」として宣言され、「string」として定義されたパッケージ レベルの変数に割り当てていました。

そこで、ストアド プロシージャの宣言を varchar(512) と "VOILA" に変更しようとしましたが、これ以上エラーは発生しません。実際には... varchar(8000) と nvarchar(4000) でも動作しました... しかし、SSIS は varchar(max) のようではありません。

于 2014-07-17T18:46:33.427 に答える
2

問題は、変数がタスクではなくパッケージにスコープされていることです。
変数のスコープをタスクに変更すると、正常に実行されます。

編集:私は尋ねる必要があると考えました-なぜですか?正直なところ、これは SSIS に関する私の理解とは一致しません。SSIS は、デナリのすべての CTP で導入されて以来、私が使用してきました。内部で何が起こっているのでしょうか?これは、タスク スコープの変数ではおかしなものですが、ファイル システム タスクで使用されるパッケージ スコープの変数ではありません。特定のタスク以外では問題はありませんが、特定のタスクで使用すると問題があります。どうしたの?

于 2012-05-03T18:54:37.857 に答える
0

SSIS パッケージ内の「余分な」変数を確認することができます。パッケージ スコープの変数は、タスクで使用できる必要があります。[変数] ウィンドウを開き、[すべての変数を表示] ウィンドウをクリックして、OutputFileName という名前の異なるスコープの 2 つの変数があるかどうかを確認します。

すべての変数を表示

SSIS では変数は名前で識別されるため、両方の変数に同じ名前が付けられている場合、より低いスコープの変数 (ファイル システム タスクを含むシーケンス コンテナーなど) は、パッケージ スコープの変数の変数識別を効果的にインターセプトします。

同じ名前の複数の変数

これが役に立てば幸いです、アンディ

于 2012-05-03T19:30:49.830 に答える
0

いくつかの情報を追加したいと思います。これは私の現在の問題に最も近い説明であり、他の人の助けになることを願っています. パラメータ化された SQL タスクからレコードセット オブジェクトをロードし、その後、recorset で for each ループを使用して、フィールドを変数にロードしています。

for each ループで読み込んでいた変数の 1 つに対して上記のエラーを受け取りました。

レコードセットにデータを入力する以前のSQL タスクを変更すると、問題は解消されました。

つまり、前の SQL タスクでこれを使用すると、後続の for each ループで COL2 を変数にロードするときにエラーが発生しました。

SELECT COL1, COL2 FROM Table WHERE COL2 = ? OR ? = ''

(また)

SELECT COL1, COL2 FROM Table WHERE COL2 = ? OR ? = N''

これにより、エラーの発生が停止しました。

SELECT COL1, COL2 FROM Table WHERE COL2 = ?

SSIS のパラメーター機能は期待外れです。

  • 選択部分にパラメーターを入れることはできません
  • パラメーターを変換関数でラップできません
  • UDF 内またはかなり複雑なクエリ内でパラメーターを使用できない
  • ドライバー (OLEDB/ADO.Net/ODBC) に応じて難解なパラメーター コードを検索する必要があります。
  • 上記のエラーから、パラメーターにフィールドを使用すると、クエリからのフィールド出力のメタデータに何らかの影響があるように見えます。
于 2013-07-18T02:16:44.140 に答える
0

次の例外が発生しています。私はそれを解決しました。問題と、問題を解決するために取った手順について説明します。

    **Error Message :** The type of the value being assigned to 
variable differs from the current variable type..



              **When :** Executing SSIS package. SSIS package is calling batch script. 
        Batch script is calling Python script. SSIS package is expecting output from 
    batch file. After executing the batch file and python script output 
should be delivered to SSIS package.  But Here I am getting the exception.

    **Python Script writing output into stdout :** 
    //Python code start
    print >>sys.stdout, "output" 
    //Python code End
    So here the output is written to standard out.

        **Issue :**  When I am calling the batch file, I am writing the log 
into one log file.
    Please check the following batch script.
    //Batch File script start
    C:\Python25\python.exe GetValFromPYthonSCript.py > scriptLog.txt  
    //Batch File script End
        So what happend is, the output is written in the log.But again 
I tried to read the output using the following line in SSIS.
    //SSIS coding start
    Dim objProcess As Process
    objProcess = New Process()
    objProcess.StartInfo.FileName = "batchFile location"
    objProcess.start()
    System.Windows.Forms.MessageBox.Show(objProcess.StandardOutput.ReadLine())
    //SSIS coding End

    So when I am trying to display I am getting the above exception.

    **Fix** : Just I have removed the log. I did not write the output into the log file.
    C:\Python25\python.exe GetValFromPYthonSCript.py
    Now I am getting the output properly.
于 2013-09-24T15:38:10.313 に答える