2017-10-05 17 views
0

私のアプリケーションはデータを読み込むためのSQLスクリプトを実行し、読み込んでいるファイルに問題がある場合、ファイルがロードされない理由に関する有用な情報を含まない最後のエラーだけをログに記録します。TRY..CATCHに複数のエラーを記録するにはどうすればいいですか?

例コード:

BEGIN TRY 
    BULK INSERT MyTableName 
    FROM 'C:\MyFilename.txt' 
    WITH 
    (
    FIELDTERMINATOR = '|', 
    ROWTERMINATOR = '\n', 
    TABLOCK, 
    MAXERRORS=0, 
    ERRORFILE = 'C:\MyFilename_Errors.log' 
    ) 
    ; 
END TRY 
BEGIN CATCH 
    INSERT INTO MyErrorLog 
    SELECT ERROR_MESSAGE() as Issue 
    , ERROR_LINE() as IssueRowNum 
    ; 
END CATCH 

このスクリプトでは、第3の誤りのために[MyErrorLog]にエントリを作成する(下記参照)。そして、ログファイルには、どのような分野何行ではなく、私に教えてくれます:30539ファイルは1910820 ERRORFILEが0オフセットオフセット

行 - ここHRESULT 0x80004005の

は、すべての3行をだ場合の内部I「THROW」のエラーCATCH:

メッセージ4864、レベル16、状態1、行3バルクロードデータ変換エラー (指定されたコードページの型の不一致または無効な文字) 行1、列5(のMyField)のために。

メッセージレベル7399、レベル16、状態1、行3 のOLE DBプロバイダ "BULK"がリンクされたサーバー "(null)"がエラーを報告しました。プロバイダは、エラーについての情報を に与えませんでした。

メッセージ7330、レベル16、状態2、行3リンクサーバー "(null)"のOLE DB プロバイダー "BULK"から行をフェッチできません。

最初のエラーメッセージと2番目のエラーメッセージをキャプチャするにはどうすればよいですか?

+0

私はほとんど肯定的です最後のメッセージを取得するキャッチを試してください。 – scsimon

+0

はい、それは私の問題です。私も最初のエラーが必要です。 – VenerableAgents

答えて

1

T-SQL CATCHブロックで1つのエラーしかキャプチャできません。 this connect itemによれば、回避策はTHROW(またはTRY/CATCHを使用しない)を使用し、クライアントコードのエラーをキャプチャすることです。

したがって、すべてのエラーをキャプチャしてログに記録できるように、クライアントアプリケーション(SQLCLRを含む)からスクリプトを呼び出す必要があります。

+0

THROWを使うと、あなたが言うようにTRY/CATCHをやっていないかのように表示されます。私のスクリプトは複数のファイルをロードしているので、コードに見つかったエラーを正しいファイルに結びつける方法はありません。本当の答えは私がそれをすることはできないと私は推測する。 – VenerableAgents

+0

@VenerableAgents、正しい、あなたが望むものはクライアントコード(SQLCLRを含む)でのみ行うことができます。私はそれをより明確にするために私の答えを更新します。 –

関連する問題