0

同じ名前の列を持つ別のテーブルに一括ロードする多数の列を生成するビューがあります。

この手順は、SqlDataReader をループして、毎回 SqlCommand を使用して SqlParameters で挿入を行っているときに正常に機能しました。100,000 もの行数の場合、これは明らかに遅すぎます。

ビューの列名とターゲット db テーブルの列名と型が一致するため (上記の手順が機能したため)、これが機能するように思われたため、SqlBulkCopy の使用に切り替えました。

ただし、最初のレコードでは、「String 型の指定された値は、指定されたターゲット列の smalldatetime 型に変換できません」という InvalidOperationException で失敗します。この最初の行には日付列が 1 つだけあり、その値は NULL です。

ビューは列のサブセットのみを返していますが、そうでないものはすべて null 可能です。

どんな助けでも大歓迎です。

4

3 に答える 3

3

sqlbulkcopy は、同じ名前の列間で自動的にマップしません。選択すると、宛先テーブルに表示されるのと同じ順序で列が返されると想定されています。

したがって、宛先テーブルに 7 つの列があり、ビューが 5 を返す場合、それらの 5 つを宛先テーブルの最初の 5 列に配置しようとします。

SqlBulkCopy クラスは、列マッピングのコレクションを取ることができます。それはトリックを行う必要があります

于 2009-12-11T10:48:11.600 に答える
0

接続に合わせてSET DATEFORMATを正しい形式 (ymd、dmy、mdy など) に設定してから、再試行してください。このエラーは通常、日付がローカライズされた形式であり、ロケールに依存しない形式である場合に発生します。

すべてを 1 回の挿入で実行する場合、これは推奨されません。これは、長時間実行されるトランザクションであり、一括挿入操作ではないと見なされるためです。

于 2009-12-11T10:41:46.903 に答える
0

単一のSQLステートメントを使用しないのはなぜですか

INSERT INTO YourTable (Col1, Col2,...) SELECT Col1, Col2, .. FROM YourView

ビューにテーブルと同じ列がある場合は、YourTable の後に (Col1, Col2,...) を削除し、ステートメントを次のように変更できます。

INSERT INTO YourTable SELECT Col1, Col2, .. FROM YourView

しかし、一般に、挿入先の列を指定するのは良い形式です。

次に、 where 句を select from YourViewに適用することもできます。

于 2009-12-11T10:38:09.960 に答える