0

SSIS でのデバッグ中に次のエラーが発生しました。

エラー: データ フロー タスクの 0xC0049064、派生列 [70]: 型キャストの実行中にエラーが発生しました。エラー: データ フロー タスクの 0xC0209029、派生列 [70]: SSIS エラー コード DTS_E_INDUCEDTRANSFORMFAILUREONERROR。エラー コード 0xC0049064 が発生したため、"コンポーネント "派生列" (70)" が失敗し、"出力列 "EVENT_DT" (118)" のエラー行処理がエラー時の失敗を示しています。指定されたコンポーネントの指定されたオブジェクトでエラーが発生しました。これより前に、失敗に関する詳細情報を含むエラー メッセージが投稿される場合があります。エラー: データ フロー タスクでの 0xC0047022: SSIS エラー コード DTS_E_PROCESSINPUTFAILED。コンポーネント "派生列" (70) の ProcessInput メソッドがエラー コード 0xC0209029 で失敗しました。識別されたコンポーネントが ProcessInput メソッドからエラーを返しました。エラーはコンポーネントに固有のものですが、エラーは致命的であり、データ フロー タスクの実行が停止します。これより前に、失敗に関する詳細情報を含むエラー メッセージが投稿される場合があります。エラー: データ フロー タスクでの 0xC0047021: SSIS エラー コード DTS_E_THREADFAILED。スレッド "WorkThread0" はエラー コード 0xC0209029 で終了しました。これより前に、スレッドが終了した理由に関する詳細情報を含むエラー メッセージが投稿される場合があります。情報: データ フロー タスクの 0x40043008、DTS.Pipeline: 実行後フェーズが開始されています。情報: データ フロー タスクの 0x40043009、DTS.パイプライン: クリーンアップ フェーズが開始されています。情報: データ フロー タスクの 0x4004300B、DTS.Pipeline: "コンポーネント "DataReaderDest" (143)" が 0 行を書き込みました。タスクが失敗しました: データ フロー タスクの警告: パッケージの 0x80019002: SSIS 警告コード DTS_W_MAXIMUMERRORCOUNTREACHED。Execution メソッドは成功しましたが、発生したエラーの数 (4) が最大許容数 (1) に達しました。故障の原因となります。これは、エラーの数が MaximumErrorCount で指定された数に達すると発生します。MaximumErrorCount を変更するか、エラーを修正してください。SSIS パッケージ "Package.dtsx" が終了しました: 失敗。

私の表現は次のとおりです。

(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" + 
 SUBSTRING(EVENT_D,4,2) + "-" + 
 SUBSTRING(EVENT_D,1,2) + EVENT_T)

元のデータは次の順序になっています。

EVENT_D: DD/MM/YYYY
EVENT_T: HH:MM:SS

どんな助けでも大歓迎です。何度も表情を変えてみましたがだめでした。

4

3 に答える 3

4

正しい形式ではない日時の値がいくつかあると思われます。そのため、SSIS はそれらの解析中にエラーをスローします。

ソース テーブルから不正な日時値を見つけるには、エラー行をリダイレクトしDerived Transformationて、データ ビューアを使用して不正なデータを確認してください。

部分文字列値の問題は、文字列データが正しい形式でない場合にDerived Transformationエラーがスローされることです。

  1. OLEDB ソース コンポーネントで、SQL を記述し、正しい日時値のみを取得してみてください

元:

 Select col1,
        case when isDate(EVENT_D) = 1 THEN EVENT_D ELSE NULL 
        END as [EVENT_D],
        Col2,EVENT_T,other columns
        from yourTable

派生変換では、コードを使用してDT_DBTIMESTAMPtype に変換します。

  1. それ以外の場合は、スクリプト コンポーネントを使用して、値と値を解析し、datetime 値に変換してみてEVENT_DくださいEVENT_T。これらすべてのsubstring値で派生列を使用する必要はありません

    New Output column Valid_Dとしてデータ型で を作成しDT_DBTIMESTAMPます。in で EVENT_D と EVENT_T の 2 つの入力列を選択しますavailable input ColumnsScript Transformation Editor

VB.NET コード

    Dim result As DateTime

If DateTime.TryParseExact(Row.EVENT_D, "dd/MM/yyyy", 
                          Nothing, Globalization.DateTimeStyles.None, result) Then
     Row.ValidD = result.Add (TimeSpan .Parse (Row.EventT ) );
End If

C# コード

DateTime result;
    if (DateTime.TryParseExact(Row.EventD, "dd/MM/yyyy",
        CultureInfo.InvariantCulture, DateTimeStyles.None,out result))
    {
         Row.ValidD = result.Add (TimeSpan .Parse (Row.EventT ) );
    }

これで、後続の変換で DateTime タイプの Valid_D 列を使用できるようになりました

Update: 構文の問題は、文字列形式で日付と時刻を追加できないことです。parseEVENT_D と EVENT_T の両方を個別に行う必要があります。

(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" + 
 SUBSTRING(EVENT_D,4,2) + "-" + 
 SUBSTRING(EVENT_D,1,2) + EVENT_T)

So your syntax is not valid.

MSDN によると、関数isDateは NULL を示します30/04/2012

   The return value of ISDATE depends on the settings set by
   SET DATEFORMAT, SET LANGUAGE and Configure the default language
   Server Configuration Option. 

01/05/2012ただし、値には 1 が返さ02/05/2012れ、MM/dd/YYYY として扱われるため、最初の日付は 2012 年 5 月 1 日ではなく 2012 年 1 月 5 日になります。

したがって、スクリプトコンポーネントを使用してこれらの値を有効な日付と時刻に解析し、その後の変換で使用します。

上記のスクリプト変換コードを確認してください

Update 2:

SSIS 2005を使用していると思います。コードは

  Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
  Dim result As DateTime
  If DateTime.TryParseExact(Row.EVENTD, "dd/MM/yyyy", Nothing,    Globalization.DateTimeStyles.None, result) Then
  Row.ValidD = result.Add(TimeSpan.Parse(Row.EVENTT))
  End If
  End Sub

スクリプト変換後、派生コンポーネントを使用する必要はありません。列 Valid_D で取得された結果には、次のdatetime 形式の有効な値が含まれています。

于 2012-12-10T07:12:32.247 に答える
0

スクリプトなしでこれを行いたい場合は、式を次のように変更するだけで済みます。

(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" + SUBSTRING(EVENT_D,4,2) + "-" + SUBSTRING(EVENT_D,1,2) + EVENT_T)

(DT_DBTIMESTAMP)(SUBSTRING(EVENT_D,7,4) + "-" + SUBSTRING(EVENT_D,4,2) + "-" + SUBSTRING(EVENT_D,1,2) + " " + EVENT_T)

日付部分と時刻部分の間にスペースがないことが、元のエラーの原因である可能性が最も高いものです。あなたは得ていた

2012-04-3012:25:37

それ以外の

2012-04-30 12:25:37

于 2012-12-10T14:22:56.367 に答える