4

SSIS データフローの途中で変換を実行するスクリプト タスクがあります。スクリプトが失敗した場合 (たとえば、文字を数値に変換しようとした場合)、「失敗」ステータスで停止し、メイン パッケージに戻り、データフロー タスク イベント ハンドラのOnErrorを使用して正常に終了する必要があります。

現時点では、データフローのスクリプト タスクが .net エラー ポップアップを返していることがわかりました。これをクリアする必要があります。デバッグウィンドウの表示を停止しているように見えるコードの周りでTry Catchを試しましたが、パッケージが失敗する原因となる「失敗ステータス」でスクリプトを終了させることができないようです。Dts.TaskResult = Dts.Results.Failure は、データフロー タスクでは有効ではないようです。現時点で私はこれを試しています:

    Catch e As System.Exception
        Me.ComponentMetaData.FireError(-1, "", "Error: ", e.Message, 1, True)
        While Not e.InnerException Is Nothing
            e = e.InnerException
            Me.ComponentMetaData.FireError(-1, "", "InnerException: ", e.Message, 1, True)
        End While
        Exit Sub
    End Try

...しかし、これは悪い行をスキップするだけです。データフローは継続します。問題は、「失敗」として終了するため、パッケージの onError エラー ハンドラー イベントがトリガーされることです。

どんな提案もありがたく受け取った。グレン

4

4 に答える 4

3

スクリプト変換には、成功または失敗を返すための同じ機能がありません。次のコードを使用してエラーを強制できます。

    If Row.TestColumn = "Value I Want To Error On" Then
        Error (1)
    End If

基本的に、Error オブジェクト (関数? メソッド? 何でも!) を使用すると、エラーをシミュレートできます。つまり、このコードでパッケージ エラーを発生させることができます。

于 2009-09-30T22:59:56.640 に答える
1

振り返ってみると、ゼロ除算エラーは必要ありません。

私の現在のソリューションでは、次のように、エラーをキャプチャしてから FireError を実行し、例外処理を再実装しています。

If excludeHeader = -1 Then
    'Throw New InvalidDataException("Invalid exclude column: " & Variables.excludeColumn)
    ComponentMetaData.FireError(0, ComponentMetaData.Name.Trim(), "Invalid exclude column: " & Variables.excludeColumn, String.Empty, 0, True)
    excelConnection.Close()
    excelConnection.Dispose()
    Return
End If

これは、ソース スクリプト内に含まれているため機能します。また、データ フローが 1 エラー後に失敗するように設定されていれば、変換スクリプトでも機能します。そうでない場合、スクリプトはエラー出力パスを実装する必要がありますが、率直に言って、私には時間がありません...

于 2011-03-09T10:10:10.027 に答える
1

私はこの質問に対する答えをしばらく探していました。ポップアップエラーは私にとってあまりにも迷惑です! これを回避するための「簡単な」解決策 (ハック) は次のとおりです。

.FireError の後にエラーをスローするのではなく、スクリプト変換で新しい DT_UI1 出力列 ("ValidationColumn" など) を作成し、1 または 0 に設定します (理由は後で明らかになります)。

スクリプト コンポーネントの直後に、派生列の変換を追加し、ValidationColumn を数式 1/ValidationColumn に置き換えます。(これはブール値では機能しません)。もちろん、これによりゼロ除算エラーが生成され、(既定の設定を使用すると) 派生列の変換が失敗し、データ フロー コンポーネントが即座に失敗します。出来上がり!

エラー ログには、.FireError からの元の検証失敗メッセージがあり、その直後にゼロ除算エラーが続きます。

これはハックかもしれませんが、誰かがより良いアイデアを思いつくまで...

ところで、これを使用して、1 つのデータ フローを使用して 2 つ以上の異なる列のバリエーションをロードするために、IMEX=1 の使用と組み合わせて、Excel ファイルの正しいヘッダーが正しい場所 (または代替の場所) にあることを確認しています。 .

于 2011-01-12T17:05:41.343 に答える
0

以下は、ループ内で作成したスクリプト タスクです。これはあなたの質問に対する直接的な回答ではありませんが、全体的な考え方は役に立ちます。

スクリプト タスクは、シーケンス コンテナー内に保持されます。また、シーケンス コンテナーのvariable名前Propagate は false に設定されます。また、sequence containerプロパティMaximumErrorCountはゼロに設定されます。そのため、シーケンス コンテナ内でエラーが発生すると、赤で表示され、OnError イベントが発生しますが、ループは続行されます。これを機能させるには、シーケンス コンテナーの onerror イベント ハンドラーを作成することが重要です。

スクリプト タスク内では、catchブロック内で強制的に失敗します (タスクの結果をFailureとして設定することにより)。また、例外メッセージは、エラー ログ テーブルに格納するための変数に格納されます。このエラー データの挿入は、OnError イベント ハンドラの (前述の) execute sql タスクから発生します。

参照: MSDN - ScriptObjectModel.TaskResult プロパティ

スクリプト タスク コードで Dts オブジェクトの TaskResult プロパティを使用して、スクリプト タスクの成功または失敗をパッケージに通知します。

スクリプト タスク内の catch ブロックは、次のようになります。

  Catch ex As Exception

        Dim exceptionVariable As Microsoft.SqlServer.Dts.Runtime.Variables = Nothing
        Dts.VariableDispenser.LockOneForWrite("User::ScriptException", exceptionVariable)
        exceptionVariable("User::CustomScriptException").Value = ex.Message
        exceptionVariable.Unlock()
        Dts.Events.FireError(-1, "Task Name", ex.Message, [String].Empty, 0)
        Dts.TaskResult = Dts.Results.Failure
  End Try

制御フロー

ここに画像の説明を入力

于 2015-12-09T20:35:34.367 に答える