Я'получаю ошибку преобразования, когда пытаюсь импортировать текстовый файл в свою базу данных. Ниже приведено сообщение об ошибке, которое я получил:
Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 4 (Year).
Вот код моего запроса:
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')
В данных примера нет ',' после атрибута Year, хотя после Year есть еще один атрибут Grade, который является NULL.
Кто-нибудь может подсказать, как это исправить?
Попробуйте использовать форматный файл, поскольку ваш файл данных имеет только 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 Год "
(source: microsoft.com)
Этот учебник о пропуске столбца с помощью BULK INSERT
также может помочь.
Тогда ваше утверждение будет выглядеть следующим образом:
USE xta9354
GO
BULK INSERT xta9354.dbo.Students
FROM 'd:\userdata\xta9_Students.txt'
WITH (FORMATFILE = 'C:\myTestFormatFiles.Fmt')
В моем случае я имел дело с файлом, который был сгенерирован hadoop на linux box. Когда я попытался импортировать его в sql, у меня возникла эта проблема. Исправлением оказалось использование шестнадцатеричного значения для 'line feed' 0x0a. Это также сработало при массовой вставке
bulk insert table from 'file'
WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a')
Приведенные выше варианты работают и для большого файла запросов 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
)