Nphox 0 / 0 / 0 Регистрация: 03.11.2014 Сообщений: 3 |
||||||||
1 |
||||||||
08.10.2016, 16:08. Показов 8505. Ответов 3 Метки нет (Все метки)
Всем привет!
Ошибка: В текстовом файле, во втором столбце самая длинная строка 19 символов. В чем проблема?
__________________
0 |
шапоклякистка 8-го дня 3672 / 2232 / 391 Регистрация: 26.06.2015 Сообщений: 4,647 Записей в блоге: 1 |
|
10.10.2016, 16:49 |
2 |
Может, в наборе символов — может, вам NVarchar надо, а не Varchar?
0 |
_pva 57 / 57 / 10 Регистрация: 27.02.2010 Сообщений: 282 |
||||
12.10.2016, 09:18 |
3 |
|||
Расширьте поле…
0 |
0 / 0 / 0 Регистрация: 09.10.2019 Сообщений: 16 |
|
02.10.2020, 19:26 |
4 |
Вангую что там была ошибка допущена на этапе генерации, и строки разделялись символом «n», а по хорошему на винде sql server ждет символ «rn», хотя в ROWTERMINATOR надо писать именно = ‘n’, но следить чтобы в файле из которого все грузится по факту было «rn» — в случае с виндой, «n» — в случае и Линукс и «r» — в случае Мака
0 |
Вопрос:
Я делал импорт данных с помощью задачи SQL Server BULK INSERT
сотни раз, но на этот раз я получаю сообщение об ошибке, которое незнакомо, и что я попытался устранить неполадки с Google. Ниже приведен код, который я использую с файлом с разделителями-запятыми, где новые строки обозначаются новыми символами строки:
BULK INSERT MyTable
FROM 'C:myflatfile.txt'
WITH (
FIELDTERMINATOR = ','
,ROWTERMINATOR = '/n')
GO
Он последовательно работает, но теперь на простом файле с датой и скоростью он не работает с ошибкой “Msg 4863, уровень 16, состояние 1, строка 1 Ошибка преобразования грубой нагрузки (усечение) для строки 1, столбец 2 (ColumnTwo ) “. Когда я смотрю на файл, я не понимаю, почему это может потерпеть неудачу (обычно устранение неполадок Google указывает на то, что разделители могут существовать несколько раз в строке, что приведет к возникновению этой ошибки). Из файла, вот первые десять строк (обратите внимание, что он не работает в FIRST-строке):
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
Таблица, в которую я вставляю эти данные, имеет два поля: VARCHAR(50)
, хотя, когда я первоначально видел усечение, я расширил поля данных до VARCHAR(2000)
и это не повлияло на это.
CREATE TABLE MyTable (
ColumnOne VARCHAR(50),
ColumnTwo VARCHAR(50)
)
Я также попытался удалить все дефисы, чтобы убедиться, что это все испортило (хотя я сделал много импорта данных с тире, используя этот же код, и он работает без ошибок), и он все равно получил то же сообщение об ошибке.
Прямой импорт работает (через Tasks
), как и SSIS, но как насчет этого кода не работает, как это должно быть сделано точно так же?
Лучший ответ:
Вероятно, проблема заключается в том, что терминатор строки не работает из-за формата файла.
Пытаться:
ROWTERMINATOR = '0x0a'
РЕДАКТИРОВАТЬ
На самом деле я просто замечаю, что вы используете косую черту, она должна быть обратная косая черта, так что это может сработать:
ROWTERMINATOR = 'n'
Ответ №1
Из SQL Server Management Studio (SSMS) для файла в стиле Unix работает ROWTERMINATOR = ‘0x0a’. Однако ROWTERMINATOR = ‘n’ не работает, поскольку SSMS, по-видимому, интерпретирует n как конец строки строки в стиле Windows ( rn) и исправляет/прерывает ее для вас.
Интересно, что если вы отправите тот же ROWTERMINATOR = ‘n’ из кода Java через драйвер JDBC SQL Server, он будет рассматриваться как конец строки в стиле Unix, так как ничто в середине не выбрасывает лишний r.
Итак, вы должны сделать две вещи:
1 – Убедитесь, что вы понимаете, как ваш файл данных действительно работает в конце строки.
2 – Убедитесь, что вы понимаете, как ваши средства доставки SQL-кода BULK INSERT SQL Server интерпретируют любые escape-последовательности. Мой ограниченный опыт заключается в том, что использование hex (‘0x0a’) для SQL Server SQL работает во всех средах.
-
На главную
-
How
- Ошибка преобразования данных массовой загрузки (усечение)
Ошибка преобразования данных массовой загрузки (усечение)
- 2023
Редактор:
Christopher Sullivan |
Написать мне
Я получаю эту ошибку
вот csv … у него только одна строка
вот мой оператор массовой вставки …
Проблема в том, что в большинстве случаев он отлично работает, но в некоторых ситуациях (это одна из них) я получаю ошибки
Любые идеи о том, что вызывает эту ошибку в этой записи
Запятые в поле комментариев используются как разделители, потому что разделители не согласованы. Лучшее решение — убедиться, что все поля заключены в двойные кавычки и установить на . В качестве альтернативы замените запятые на то, что вряд ли будет в комментариях (например, ), и установите .
В дополнение к комментариям Уила, похоже, что он видит все 12 столбцов, поэтому может быть просто ваш указатель строк неверен. Во-первых, убедитесь, что программа, объединяющая эти файлы, на самом деле помещает возврат каретки в конец последней строки; Мне приходилось исправлять многие программы, где этого не было. Как только вы убедитесь, что там есть возврат каретки, вам, возможно, придется поэкспериментировать, чтобы увидеть, какой это тип возврата каретки. Иногда это только char (10), иногда только char (13), а иногда и то и другое, но в неправильном порядке. Так что поэкспериментируйте с:
- Часто, если указатель строки неверен или непоследователен, он может заставить его объединять строки до тех пор, пока он не попадет в распознанный терминатор или даже на eof. У меня такое случалось раньше.
System.Data.SqlClient.SqlException (0x80131904): ошибка преобразования данных массовой загрузки (усечение) для строки 97, столбца 33
Для указанной выше ошибки вы можете проверить
- Размер типа данных столбца (например, VARCHAR (255)), достаточно ли импортировать данные или нет.
- И терминатор строки например
- ROWTERMINATOR = ‘0x0A’
- ROWTERMINATOR = ‘ n’
- ROWTERMINATOR = ‘ r n’
- FIELDTERMINATOR
- Убедитесь, что выбранный терминатор поля не встречается в данных. Если есть вероятность, замените его другим символом, например. | в файле.
- 1 ROWTERMINATOR 0x0A сделал это за меня, а не комбинации n или r.
у меня был заголовок как первая строка. после того, как я удалил его, все было хорошо.
Это можно легко решить, используя следующую команду в вашей массовой вставке:
Это позаботится о запятых в строке.
Пожалуйста, выберите этот ответ, если он вам помог.
Ошибка преобразования данных массовой загрузки (усечение)
Я получаю эту ошибку
Bulk load data conversion error (truncation) for row 1, column 12 (is_download)
вот csv…он имеет только одну строку
30,Bill,Worthy,sales,,709888499,bat@bat.com,,"Im a a people person., to work together for this new emerging env.HTTP://applesoftware.com","Bill and Son of Co","Contact Us: Contact Form",0
вот мой оператор bulk insert…
SE SalesLogix
GO
CREATE TABLE CSVTemp
(id INT,
firstname VARCHAR(255),
lastname VARCHAR(255),
department VARCHAR(255),
architecture VARCHAR(255),
phone VARCHAR(255),
email VARCHAR(255),
download VARCHAR(255),
comments VARCHAR(MAX),
company VARCHAR(255),
location VARCHAR(255),
is_download VARCHAR(255)
)
GO
BULK
INSERT CSVTemp
FROM 'c:leadsleads.csv'
WITH
(
DATAFILETYPE = 'char',
BATCHSIZE = 50,
FIELDTERMINATOR = ',',
ROWTERMINATOR = 'n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTemp
GO
проблема в большинстве случаев работает отлично, но в некоторых ситуациях (это один из них) я получаю ошибки
любые идеи о том, что вызывает эту запись, чтобы эта ошибка
3 ответов
он собирает запятые в поле комментариев в качестве разделителей, потому что разделители не согласованы. Лучшее решение-обеспечить, чтобы все поля были обернуты двойными кавычками и установлены FIELDTERMINATOR
до '","'
. В качестве альтернативы замените запятые чем-то маловероятным в комментариях (например,~
) и установить FIELDTERMINATOR = '~'
.
в дополнение к комментариям Вила, кажется, что он видит все 12 столбцов, поэтому может быть, что ваш rowterminator неверен. Во-первых, убедитесь, что программа, которая объединяет эти файлы, фактически помещает возврат каретки в конце последней строки; мне пришлось исправить многие программы, где это было не так. Как только вы убедитесь, что там есть возврат каретки, вам, возможно, придется поэкспериментировать, чтобы увидеть, какой тип возврата каретки. Иногда это только char (10), иногда тип char(13), а иногда он может иметь оба, но в неправильном порядке. Поэтому экспериментируйте с:
ROWTERMINATOR = 'n'
ROWTERMINATOR = 'r'
ROWTERMINATOR = 'nr'
ROWTERMINATOR = 'rn'
Я получаю эту ошибку
Bulk load data conversion error (truncation) for row 1, column 12 (is_download)
вот csv… он имеет только одну строку
30,Bill,Worthy,sales,,709888499,[email protected],,"Im a a people person., to work together for this new emerging env.HTTP://applesoftware.com","Bill and Son of Co","Contact Us: Contact Form",0
вот мое выражение о массовой вставке…
SE SalesLogix
GO
CREATE TABLE CSVTemp
(id INT,
firstname VARCHAR(255),
lastname VARCHAR(255),
department VARCHAR(255),
architecture VARCHAR(255),
phone VARCHAR(255),
email VARCHAR(255),
download VARCHAR(255),
comments VARCHAR(MAX),
company VARCHAR(255),
location VARCHAR(255),
is_download VARCHAR(255)
)
GO
BULK
INSERT CSVTemp
FROM 'c:leadsleads.csv'
WITH
(
DATAFILETYPE = 'char',
BATCHSIZE = 50,
FIELDTERMINATOR = ',',
ROWTERMINATOR = 'n'
)
GO
--Check the content of the table.
SELECT *
FROM CSVTemp
GO
Проблема в том, что большую часть времени он отлично работает, но в некоторых ситуациях (это один из них) я получаю ошибки
Все идеи о том, что заставляет эту запись иметь эту ошибку
Ответ 1
Он собирает запятые в поле комментариев как разделители, потому что разделители несовместимы. Лучшим решением является обеспечение того, чтобы все поля были обернуты двойными кавычками, и установите FIELDTERMINATOR
на '","'
. В качестве альтернативы замените запятые на что-то маловероятное, чтобы быть в комментариях (например, ~
) и установить FIELDTERMINATOR = '~'
.
Ответ 2
В дополнение к комментариям Уил, похоже, что они видят все 12 столбцов, поэтому может быть просто неверно, что ваш гребцовщик. Во-первых, убедитесь, что программа, которая объединяет эти файлы, фактически возвращает карету в конце последней строки; Мне пришлось исправлять многие программы там, где это было не так. Как только вы убедитесь, что там есть возврат каретки, вам, возможно, придется поэкспериментировать, чтобы узнать, какой тип возврата каретки. Иногда это только char (10), иногда только char (13), и иногда он может иметь оба, но быть в неправильном порядке. Поэтому экспериментируйте с:
ROWTERMINATOR = 'n'
ROWTERMINATOR = 'r'
ROWTERMINATOR = 'nr'
ROWTERMINATOR = 'rn'
Ответ 3
System.Data.SqlClient.SqlException(0x80131904): Ошибка преобразования данных массовой загрузки (усечение) для строки 97, столбец 33
Для вышеуказанной ошибки вы можете проверить
- Размер типа данных в столбце (например, VARCHAR (255)), если достаточно импортировать данные или нет.
- И ограничитель строки, например
- ROWTERMINATOR = ‘0x0A’
- ROWTERMINATOR = ‘n’
- ROWTERMINATOR = ‘ rn’
- FIELDTERMINATOR
- Убедитесь, что выбранный полевой терминатор не встречается в данных. Если есть шанс, замените его другим символом, например | в файле.
Как игнорировать ошибку преобразования данных массовой загрузки (усечение)
У меня есть файл, который представляет собой выдержку из таблицы MySQL, которую я хотел бы, в свою очередь, загрузить в таблицу SQL (файл csv) через задание SSMS. Однако в файле есть поле, которое определено как «LONGTEXT», что слишком велико для таблицы SQL. Я хотел бы использовать BULK INSERT для загрузки файла, но, как и ожидалось, я получаю сообщение об ошибке «Ошибка преобразования данных массовой загрузки (усечение)» в поле «LONGTEXT». Я не против обрезать поле, чтобы загрузить его, но не знаю, как игнорировать эту конкретную ошибку. Есть идеи, как с этим справиться?
Большое спасибо заранее!
Каков размер столбца, в который вы его вставляете?
— Hogan
05.04.2021 17:41
THM — Как работает сайт
Привет, этот пост будет одним из первых прохождений, которые я пишу, бросая вызов самому себе для продолжения 100-дневного обучения на TryHackMe . На…
Ответы
1
Учитывая то, что вы сказали, есть два способа решить проблему.
-
Увеличьте столбец в таблице, в которую вы вставляете данные
-
Уменьшите размер данных в CSV-файле.
Если вы не можете выполнить одно из этих двух действий, вы не сможете использовать BULK INSERT, не получив сообщения об ошибке.
Я этого боялся. Я не могу попросить продавца подрезать поле. Я не могу увеличить столбец в SQL, так как поле может содержать 4 294 967 295 символов. Я даже не могу решить эту проблему с помощью пакета SSIS, о котором я знаю. Есть идеи, как уменьшить размер данных в этом поле?
— Henry
05.04.2021 20:00
Неважно, я смог решить эту проблему в своем пакете SSIS. Спасибо!
— Henry
05.04.2021 20:27
@Henry — это должно уместиться в varchar (max) в наши дни
— Hogan
07.04.2021 07:18