0

誰かがこれを手伝ってくれることを願っています。SSISを使用してExcelから抽出し、OLEデータベースにロードしています。データベースに入る前に、無効な列とnull列のある行を除外し、エラーのあるこれらの行を別のデータベースに保存してエラーを確認する必要があります。

これは私のTransactionRecordExcelのデータです。

CustID  TransactionDate TransactionTime AmountSpent
123     1/2/2011        10:30           $1 
(null)  3/4/2012       (null)           $8 
789     3/4/2011        12:00           $7 
698     (null)          11:23           $5 

*(null)はExcelの空のフィールドを表します。

現在、これは私がSSISで行ったことです

TransactionRecord.xlsx --->条件付き分割-(ケース1:nullの行をフィルター処理)-> ErrorDB-
                                                                      (デフォルト出力)---> TransactionDB

次の条件では、null値の行のみを除外できます:
ISNULL(CustID)|| ISNULL(TransactionDate)|| ISNULL(TransactionTime)|| ISNULL(AmountSpent)

ただし、この方法では、null値を持つ列を特定できません。ErrorDBにErrorMsg列があり、どの列を変更する必要があるかを示すことを考えています。

ErrorDB:

CustID  TransactionDate   TransactionTime   AmountSpent   ErrorMsg
null    3/4/2012          null              $8            CustIDNull, TimeNull
698     null              11:23             $5            DateNull

「派生列」変換を使用して新しいErrorMsg列を追加しようとしましたが、どの列にエラーがあるかを特定できません。

これらのエラー列を抽出してデータベースに保存するためのより良い方法はありますか?

(私はstackoverflowを初めて使用するため、画像を投稿できません。したがって、十分なレピュテーションポイントがありません)

4

3 に答える 3

0

ErrorMsg列に最初に見つかった列エラーを含める場合は、派生列に以下を追加します。

ISNULL(CustID) ? "CustID Error" : 
  ISNULL(TransactionDate) ? "TransactionDate Error" :
    ISNULL(TransactionTime) ? "TransactionTime Error" : 
      ISNULL(AmountSpent) ? "AmountSpent Error" : "Unknown Error" 

列エラーのリストが必要な場合は、次のようなものを使用してください。

LTRIM((ISNULL(CustID) ? "CustID " : "") +
(ISNULL(TransactionDate) ? "TransactionDate " : "") +
(ISNULL(TransactionTime) ? "TransactionTime " : "") +
(ISNULL(AmountSpent) ? "AmountSpent" : ""))

または、スクリプトコンポーネント変換を介してエラーを送信し、エラー列ごとに1行を書き出すように設定できます。

于 2013-03-25T12:03:36.407 に答える
0
  1. マルチキャスト変換を使用して、メインのデータフローから切り離します
  2. 非同期スクリプトコンポーネントを使用して、すべての列をループし、null値を持つ行/列ごとに新しい行を書き込みます
  3. 結果のデータフローをErrorDBに書き込みます

このスクリプトのコードは次のようになります。

' Loop through all columns and create field elements
For Each column As IDTSInputColumn100 In Me.ComponentMetaData.InputCollection(0).InputColumnCollection

'Get Column Name
sColumnName = column.Name

' Get column value, will catch if null 
Try

    'Clean up column name (VB/SSIS will do this when processing columns so we need to ask for the value using cleaned up column name)
    sColumnNameClean = column.Name.Trim().Replace(" ", "").Replace(".", "").Replace(":", "").Replace("-", "")

    'Get column value
    sColValue = rowType.GetProperty(sColumnNameClean).GetValue(Row, Nothing).ToString()


Catch

    'Add reference to function to create row here, referencing sColumnName

End Try


Next
于 2013-03-25T12:07:12.680 に答える
0

あなたのデータを使用してExcel2010ファイルを作成しました。

次に、2つのテーブルを作成しました。

CREATE TABLE [123XLSX] (
    [CustID] INT  NOT NULL,
    [TransactionDate] datetime NOT NULL,
    [TransactionTime] datetime NOT NULL,
    [AmountSpent] money NOT NULL
)

CREATE TABLE [123XLSXError] (
    [CustID] VARCHAR(50) NULL,
    [TransactionDate]  VARCHAR(50) NULL,
    [TransactionTime]  VARCHAR(50) NULL,
    [AmountSpent]  VARCHAR(50) NULL,
    [ErrorCode] int,
    [ErrorColumn] int
)

次に、ExcelソースをOleDB Dest(表123XLSX)に接続します。この宛先から、エラー出力を別のOLEDB Dest(表123XLSXError)に送信します。

結果:

  SELECT * FROM [dbo].[123XLSX]
  SELECT * FROM [dbo].[123XLSXError]

CustID TransactionDate         TransactionTime         AmountSpent
------ ----------------------- ----------------------- ------------
123    2011-01-02 00:00:00.000 1899-12-30 10:30:00.000 1.00
789    2011-03-04 00:00:00.000 1899-12-30 12:00:00.000 7.00

CustID TransactionDate          TransactionTime         AmountSpent ErrorCode  ErrorColumn
------------------------------  -----------             ----------- ----------
NULL   2012-03-04 00:00:00      NULL                     8           -1071607683 41
698    NULL                     1899-12-30 11:23:00      5           -1071607683 42

これは正確な解決策ではありませんが、エラーが発生した行とそのフィールド値が表示されます。

この結果をさらに磨きたい場合は、ここにいくつかの良い例があります。サポートが必要な場合は、お知らせください。

https://naseermuhammed.wordpress.com/tips-tricks/getting-error-column-name-in-ssis/

http://dougbert.com/blog/post/Adding-the-error-column-name-to-an-error-output.aspx

于 2013-03-26T15:46:19.800 に答える