3

非常に大きな区切りファイルを処理しています。これらのファイルは、フィールドと行の区切り文字が有効であることを確認するために前処理されています。時折、TSQL制約に失敗する行が処理されます(通常はデータ型の問題)。この場合、入力データを「修正」することはできません。

MAXERRORS許容可能な数の入力エラーを設定し、ERRORFILE失敗した行をログに記録するために使用します。

一括挿入はSSMSで完了し、失敗した行ごとに重大度レベル16のエラーメッセージがメッセージウィンドウに記録されます。C#SqlCommandクラスを介してこのコードを実行しようとすると、最初の重大度レベル16のエラーメッセージが生成されたときに例外がスローされ、バッチが失敗します。

操作を完了し、C#やSqlCommandなどを介してSQLエラーメッセージを無視する方法はありますか?

コマンドの例:

BULK INSERT #some-table FROM 'filename' 
WITH(FIELDTERMINATOR ='\0',ROWTERMINATOR ='\n',FIRSTROW = 2, MAXERRORS = 100, ERRORFILE = 'some-file')
4

3 に答える 3

0

SqlBulkCopyを使用してから、 SqlRowsCopiedイベントを使用してコピーされた行をキャプチャしてください。BULK INSERTこれにより、 T-SQL コマンドをより厳密に模倣できます。

編集: SqlBulkCopy では、エラー処理がそれほど堅牢ではないようです。ただし、探していることを実行しているように見える例を次に示します。

http://www.codeproject.com/Articles/387465/Retrifying-failed-records-after-an-SqlBulkCopy-exc

于 2012-07-19T18:57:47.397 に答える
0

.NET はすべてのデータ型を SQL としてサポートしているため、.NET で TryParse を実行して変換エラーをキャッチできるはずです。日付では、SQL データ範囲内でテストする必要もあります。テキストの長さをテストする必要があります。私はいくつかの非常に大きな挿入でこれを正確に行い、いくつかのCSVを解析しました。TryParse はかなり高速です。スローやエラーのオーバーヘッドがないため、Try Catch よりも優れています。

そして、.NET C# に挿入してみませんか。一括コピー用のクラスがあります。解析中に TVP 非同期挿入を使用し、一度に 10,000 を実行します。

于 2012-07-19T19:18:40.290 に答える