Ошибка преобразования данных массовой загрузки (несоответствие типа или недопустимый символ для указанной кодовой страницы) для строки 1, столбец 4 (год) - программирование
Подтвердить что ты не робот

Ошибка преобразования данных массовой загрузки (несоответствие типа или недопустимый символ для указанной кодовой страницы) для строки 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

Может кто-нибудь, пожалуйста, скажите мне, как это исправить?

4b9b3361

Ответ 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