質問: たとえば、DataTableのデータをSQLテーブルに挿入するC#のSqlTransactionを開始しますが、このデータはたくさんのデータであるため、SQLトランザクション内でSqlBulkCopyを使用して「チャンク」を行い、すべてのチャンクが正常にコピーされていればトランザクション。 今度は、挿入される値の長さがターゲットテーブルの最大列サイズを超えることがあるので、SqlBulkCopyは特定の「チャンク」のその時点で失敗します。この例外をキャッチして、テーブル/列を変更してターゲット列の最大長を増やし、次にSqlBulkCopyを実行して、次の 'チャンク'をピックアップしてコピーしないようにすることは可能です(または推奨します)。あなたが始めた「挿入取引」をコミットしましたか? DMLトランザクションを開始し、コミットされていないトランザクションの途中で停止し、DDLを実行してターゲット表を変更し、元のDMLを完了してコミットすることは可能ですか?
回答: あなたの質問に答えるために、insert文の間の表を変更することは可能です。トランザクションを各バッチに適用する場合は、1つのバッチをロールバックして列の長さを更新するだけで済みます。この方法では、データ挿入を開始する前に列の長さを設定するよりもオーバーヘッドがあります。 データのインポートを開始する前に、ソースデータの各列を最大長でチェックし、次に新しい列の長さでターゲットデータベースを更新するのがよい方法です。そうすれば、ターゲットデータベースが提供されるすべてのデータを受け入れることができます。