2013-03-01 3 views
2

Я делал импорт данных с помощью задачи SQL Server BULK INSERT сотни раз, но на этот раз я получаю сообщение об ошибке, которое незнакомо, и что я попытался устранить неполадки безрезультатно с Google. Ниже приведен код, я использую с разделителями deliminated файл, в котором новые строки обозначены новые строки символов:Ошибка в массовой вставке «Ошибка преобразования данных массовой загрузки (усечение)»

BULK INSERT MyTable 
FROM 'C:\myflatfile.txt' 
WITH (
    FIELDTERMINATOR = ',' 
    ,ROWTERMINATOR = '/n') 
GO 

Он постоянно работает, но теперь на простой файл с датой и скоростью, это провал с ошибка «Msg 4863, уровень 16, состояние 1, строка 1 Ошибка преобразования данных массовой загрузки (усечение) для строки 1, столбец 2 (столбец)." Когда я смотрю на файл, я не понимаю, почему это может потерпеть неудачу (обычно устранение неполадок Google указывает на то, что разделители могут существовать несколько раз в строке, что приведет к возникновению этой ошибки). Из файла, вот первые десять строк (обратите внимание, что он не на первой линии):

1961-01-01,8.2 
1961-02-01,8.2 
1961-03-01,7.4 
1961-04-01,7.6 
1961-05-01,7.8 
1961-06-01,8.5 
1961-07-01,9.1 
1961-08-01,8.8 
1961-09-01,8.4 
1961-10-01,8.8 

Таблица, я вставив эти данные в два поля Thare являются VARCHAR(50), несмотря на то, когда я сначала видел усечение I расширило поля данных до VARCHAR(2000), и это не повлияло на это.

CREATE TABLE MyTable (
    ColumnOne VARCHAR(50), 
    ColumnTwo VARCHAR(50) 
) 

Я также попытался удалить все черточки, чтобы увидеть, если это был Мессинг вещи (хотя я сделал много импорта данных с прочерками, используя этот же код и он работает без ошибок), и он все-таки получил то же сообщение об ошибке.

Прямой импорт работает (через Tasks), как и SSIS, но как насчет этого кода не удается, так как это должно быть то же самое?

ответ

11

Проблема, скорее всего, терминатор строки не работает из-за формата файла.

Try:

ROWTERMINATOR = '0x0a' 

EDIT

На самом деле я просто заметил, что вы используете прямой слэш, она должна быть обратной косой черты, так что это может работать:

ROWTERMINATOR = '\n' 
+0

Thanks; как я могу отличить, является ли это '/ n' или '0x0a', как в файле, он кажется новым символом линии? Я этого раньше не видел. – Tim

+0

Если ваш файл из системы на основе UNIX, вы должны использовать '0x0a' обычно (поскольку UNIX использует только \ n - linefeed в качестве терминатора). Если ваш файл находится на базе Windows, объемная копия фактически будет использовать \ r \ n, даже если вы укажете только \ n (это как возврат каретки, так и перевод строки). – EkoostikMartin

2

С SQL Server Management Studio (SSMS), для файла в стиле Unix работает ROWTERMINATOR = '0x0a'. Однако ROWTERMINATOR = '\ n' не работает, поскольку SSMS, по-видимому, интерпретирует \ n как конец строки строки в стиле Windows (\ r \ n) и исправляет/прерывает ее для вас.

Интересно, что если вы отправите тот же код ROWTERMINATOR = '\ n' из кода Java через JDBC-драйвер SQL Server, он будет рассматриваться как конец строки в стиле Unix, поскольку ничто в середине не бросает лишние \р.

Таким образом, вы должны сделать две вещи:

1 - Убедитесь, что вы понимаете, как файл данных на самом деле делает конец-строки.

2 - Убедитесь, что вы понимаете, как ваши средства доставки SQL-кода BULK INSERT SQL Server интерпретируют любые escape-последовательности. Мой ограниченный опыт заключается в том, что использование hex ('0x0a') для SQL Server SQL работает во всех средах.

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