質問: 1000; } } } ``` 基本的に、このクエリは、入力sql文字列を使用してデータにアクセスします。これにはすべて正しいフィールド名が含まれているため、columnmappingsを設定する必要はありません。 計算されたフィールドを持つテーブルに到達するまで、これは機能していました。 SQLBulkCopyはフィールドをスキップすることを知らないようで、エラーで失敗した列を更新しようとします。 "列 'columnName'は、計算列またはUNION演算子の結果であるため変更できません。 計算されたフィールドをスキップする簡単な方法はありますか? 私は完全な列マッピングを指定する必要がないことを望んでいます。
回答: これを避けるには2つの方法があります: * ColumnMappingsを使用して列の関係を正式に定義します(これは必要ありません) * *ステージングテーブルに*データをプッシュする - コアトランザクションテーブルの一部ではなく、このデータのインポートと*まったく同じ*ように見える基本的なテーブル。 TSQLコマンドを使用してステージングテーブルから実テーブルにデータを転送します 私はいつも第二の選択肢を好む、様々な理由から: * 私はマッピングを混乱させる必要はありません - これは実際に私にとって重要です; p * 実テーブルへの挿入は完全にログに記録されます( `SqlBulkCopy`は必ずしもログに記録され*ません* ) * 私はできるだけ速く挿入することができます。制約のチェックやインデックスの作成はありません。 * 私はインポート中にトランザクションテーブルを束縛せず、部分的にインポートされたテーブルに対して反復不能なクエリが実行されるリスクはありません * トランザクションを使用しなくてもインポートが途中で失敗した場合、安全な中止オプションがあります(この時点ではトランザクションシステムには何も触れていません) * アプリケーション層で`DataTable`すべてをバッファリングする必要もなく、実際のテーブルにデータをプッシュする際にある程度のデータ処理を可能にするか、カスタム`IDataReader`実装します