Ошибка преобразования данных массовой загрузки (несоответствие типа или недопустимый символ для указанной кодовой страницы) для строки 1, столбец 4 (год)
Я получаю ошибку преобразования при попытке импортировать текстовый файл в мою базу данных. Ниже приведено сообщение об ошибке:
Ошибка преобразования данных массовой загрузки (тип несоответствия или недопустимый символ для указанной кодовой страницы) для строки 1, столбец 4 (год).
Вот мой код запроса:
CREATE TABLE Students
(
StudentNo Integer NOT NULL Primary Key,
FirstName VARCHAR(40) NOT NULL,
LastName VARCHAR(40) NOT NULL,
Year Integer,
GPA Float NULL
);
Вот пример данных из текстового файла:
100,Christoph,Van Gerwen,2011
101,Anar,Cooke,2011
102,Douglis,Rudinow,2008
Я думаю, что знаю, в чем проблема. Вот мой код вставки вставки:
use xta9354
bulk insert xta9354.dbo.Students
from 'd:\userdata\xta9_Students.txt'
with (fieldterminator = ',',rowterminator = '\n')
С образцами данных после атрибута "Год" нет атрибута ",", кроме того, есть еще один атрибут "Оценка после года", который равен NULL
Может кто-нибудь, пожалуйста, скажите мне, как это исправить?
Ответы
Ответ 1
Попробуйте использовать файл формата format file, поскольку ваш файл данных имеет только 4 столбца. В противном случае попробуйте OPENROWSET
или используйте промежуточный стол.
myTestFormatFiles.Fmt
может выглядеть так:
9.0
4
1 SQLINT 0 3 "," 1 StudentNo ""
2 SQLCHAR 0 100 "," 2 FirstName SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 100 "," 3 LastName SQL_Latin1_General_CP1_CI_AS
4 SQLINT 0 4 "\r\n" 4 Year "
![]()
(источник: microsoft.com)
Это руководство по пропуску столбца с BULK INSERT
также может помочь.
Ваше выражение тогда будет выглядеть так:
USE xta9354
GO
BULK INSERT xta9354.dbo.Students
FROM 'd:\userdata\xta9_Students.txt'
WITH (FORMATFILE = 'C:\myTestFormatFiles.Fmt')
Ответ 2
В моем случае я имел дело с файлом, который был создан hadoop в окне linux. Когда я попытался импортировать в sql, у меня была эта проблема. Фиксирование завершено, чтобы использовать шестнадцатеричное значение для 'line feed' 0x0a. Он также работал для массовой вставки
bulk insert table from 'file'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a')
Ответ 3
Мы также используем объемную вставку. Файл, который мы загружаем, отправлен от внешнего участника. После некоторого времени устранения неполадок я понял, что в их файле есть столбцы с запятыми. Просто еще одна вещь, чтобы искать...
Ответ 4
Вышеуказанные параметры работают и для большого файла запросов Google. Я экспортировал данные таблицы в облачное хранилище Goodle и загрузил их оттуда. При загрузке того же на sql сервер столкнулся с этой проблемой и мог успешно загрузить файл после указания разделителя строк как
ROWTERMINATOR = '0x0a'
Также обратите внимание на заголовок записи и укажите
FIRSTROW = 2
Мой последний блок для экспорта файла данных из Google BigQuery выглядит следующим образом.
BULK INSERT TABLENAME
FROM 'C:\ETL\Data\BigQuery\In\FILENAME.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',', --CSV field delimiter
ROWTERMINATOR = '0x0a',--Files are generated with this row terminator in Google Bigquery
TABLOCK
)
Ответ 5
Добавлен полный доступ MSSQLSERVER к папкам, ролям сервера diskadmin и bulkadmin.
В моем приложении c # при подготовке к команде массовой вставки
string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM '" + strFileName + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n')";
И я получаю эту ошибку - ошибка преобразования данных при массовой загрузке (несоответствие типов или недопустимый символ для указанной кодовой страницы) для строки 1, столбца 8 (STATUS).
Я посмотрел на свой лог файл и обнаружил, что терминатор становится '' вместо '\n'.
Поставщик OLE DB "BULK" для связанного сервера "(null)" сообщил об ошибке. Поставщик не предоставил никакой информации об ошибке:
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)". Query :BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\NEWSTAGEWWW\CalAtlasToPWCR\Results\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', **ROWTERMINATOR = ''**)
Поэтому я добавил дополнительный экранирующий аргумент к определителю строки - string strsql = "BULK INSERT PWCR_Contractor_vw_TEST FROM '" + strFileName + "' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\\n')" ;
И теперь он вставляется успешно.
Bulk Insert SQL - ---> BULK INSERT PWCR_Contractor_vw_TEST FROM 'G:\\NEWSTAGEWWW\\CalAtlasToPWCR\\Results\\parsedRegistration.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n')
Bulk Insert to PWCR_Contractor_vw_TEST successful... ---> clsDatase.PerformBulkInsert