質問: 私は同じ名前の列を持つ別のテーブルに一括ロードするいくつかの列を生成するビューを持っています。 このプロシージャは、SqlDataReaderをループして、SqlCommandを使用してSqlParametersを挿入するたびに正常に機能しました。明らかに、多くの100000の行について、これは遅すぎました。 私はSqlBulkCopyを使用するように切り替えました。これは、ビューの列名とターゲットのdbテーブルの列名と型が一致しているためです(上の手順が有効なので!)。 ただし、最初のレコードでは、 "指定されたString型の値を指定されたターゲット列のsmalldatetime型に変換できません"というInvalidOperationExceptionが発生して失敗します。この最初の行には1つの日付列があり、その値はNULLです。 ビューは列のサブセットを返すだけですが、それ以外の列はすべてnullableです。 どんな助けもありがとう。
回答: sqlbulkcopyは、同じ名前の列間を自動的にはマッピングしません。これは、選択が、宛先表で表示されているのと同じ順序で列を戻すことを前提としています。 したがって、宛先テーブルに7つの列があり、ビューが5を返す場合は、それらを5つの宛先テーブルの最初の5つの列に入れます。 SqlBulkCopyクラスは、列マッピングのコレクションをとることができます。それはトリックを行う必要があります