2009-12-11 2 views
0

У меня есть представление, которое генерирует несколько столбцов, которые я хочу загрузить в другую таблицу, которая имеет одинаково названные столбцы.Ошибка SqlBulkCopy с проблемой преобразования строки

Эта процедура работала нормально, когда я перебирал SqlDataReader и выполнял вставку с SqlParameters с помощью SqlCommand каждый раз. Очевидно, что для многих 100000 строк, это было слишком медленно.

Я переключился на использование SqlBulkCopy, так как казалось, что это сработает, поскольку имена столбцов представлений и целевые имена таблиц столбцов и типов соответствуют (поскольку эта процедура работала!).

Однако в первой записи с ошибкой InvalidOperationException не указано выражение «Данное значение типа String не может быть преобразовано в тип smalldatetime указанного столбца назначения». В этой первой строке есть только один столбец даты, и его значение равно NULL.

Вид возвращает только подмножество столбцов, но те, для которых он не является, являются нулевыми.

Любая помощь будет оценена по достоинству.

ответ

3

sqlbulkcopy автоматически не сопоставляет столбцы с тем же именем. Предполагается, что ваш выбор будет возвращать столбцы в том же порядке, в котором он видит их в таблице адресатов.

Так что, если в таблице назначения есть 7 столбцов, а представление возвращает 5, оно попытается поместить эти 5 в первые 5 столбцов таблицы назначения.

Класс SqlBulkCopy может принимать коллекцию сопоставлений столбцов. Это должно сделать трюк

+1

Отлично, я думал, что это сделает сам, спасибо. –

+0

Это мега полезная информация. –

0

Почему вы ноут просто использовать один оператор SQL

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

Если вид имеет те же столбцы, как таблицы, вы можете уронить (COL1, Col2, ...) после того, как YourTable и смените акт на

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

Но в целом это хорошая форма для указания столбцов, в которые вы вставляете.

Вы также можете применить предложение where к выбору от YourView.

+0

К сожалению, они находятся в двух отдельных базах данных и запускают отдельные операторы Insert с использованием SqlCommands, как указано выше, медленно. –

+0

Я отменил отрицательный результат, потому что я понимаю, что это хорошее решение в одной конфигурации базы данных. Я предполагаю, что он не может охватывать несколько соединений? –

+0

Тем не менее, это не должно быть проблемой, вы можете использовать 4 части обозначения. SELECCT * FROM Server.Database.dbo.Table –

0

попробуйте установить SET DATEFORMAT, чтобы исправить формат (ymd, dmy, mdy, ...) для вашего соединения и повторить попытку. эта ошибка обычно возникает, если у вас есть даты в локализованном формате, а не в локальном независимом формате.

Что касается всего этого в одной вставке, это не рекомендуется, так как считается долгой транзакцией, а не операцией объемной вставки.

Смежные вопросы