powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / BULK INSERT
22 сообщений из 22, страница 1 из 1
BULK INSERT
    #39944128
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет
помогите, пожалуйста

имею два огромных файла
в каждом по 90 полей
в первом 360 тыс строк
во втором 480 тыс строк
Разделитель вертикальная черта

Импортирую:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BULK INSERT
   dbo.[my_table]
      FROM 'C:\Import\my_table.txt'
     WITH
    (
		CODEPAGE = 65001,
		FIELDTERMINATOR = '|'
		, errorfile  = 'C:\Import\err2.log'
		, MAXERRORS = 50
	)



содержимое файла опубликовать не могу, извините - корпоративная этика.

Первый файл импортируется нормально и без проблем.
Второй не импортируется. Сервер пишет ошибку:
авторСообщение 4832, уровень 16, состояние 1, строка 21
Массовая загрузка: непредвиденный конец файла данных.
Сообщение 7399, уровень 16, состояние 1, строка 21
Поставщик OLE DB "BULK" для связанного сервера "(null)" сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Сообщение 7330, уровень 16, состояние 2, строка 21
Не удалось получить строку от поставщика OLE DB "BULK" для связанного сервера "(null)".

в журнале ошибок пишет:
err2.log.Error.TxtRow 205778 File Offset 412035868 ErrorFile Offset 0 - HRESULT 0x80004005

не совсем понимаю, почему в файле err2.log.Error.Txt ссылка на строку 205778

в журнале ошибочных строк err2.log не увидел никаких явных отличий от корректных строк, чтобы на что-то обратить внимания. Но файл ошибочных строк содержит предпоследнюю строку из импортируемого файла.

перевод каретки в конце файла есть

авторMicrosoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64) Mar 18 2018 09:11:49 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor)

чего я не учел? что не так ?
спасибо за помощь
...
Рейтинг: 0 / 0
BULK INSERT
    #39944129
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Методом деления файла пополам определяете проблемную строку (необязательно физически делить файл. BULK умеет грузить со строки N).
2. Методом деления строки пополам - выясняете проблемный разделитель.
3. Никто это за вас делать не будет.
4. Чудесной кнопки - нет.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944130
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, дважды нажал кнопку.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944132
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
1. Методом деления файла пополам определяете проблемную строку (необязательно физически делить файл. BULK умеет грузить со строки N).


Так и начал делать. И параллельно рыл интернет

Наткнулся еще на такую форму запроса

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
BEGIN TRANSACTION
BEGIN TRY
BULK INSERT  dbo.mytable 
FROM 'C:\Import\file.txt'
WITH (
CODEPAGE = '65001', 
DATAFILETYPE = 'char', 
FIELDTERMINATOR = '|', 
errorfile  = 'C:\Import\err0.log',
ROWS_PER_BATCH = 10000, 
TABLOCK
)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH



И все успешно загрузилось.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944133
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя нет. Слишком рано радовался.
Отсутствие текста ошибки не говорит об отсутствии ошибки.
В итоге ничего не загрузилось и журнал ошибок тот же.

Пошел я дальше ковыряться и вспоминать метод дихотомии
...
Рейтинг: 0 / 0
BULK INSERT
    #39944135
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а есть ли параметр, который бы говорил, что загрузить нужно только 10000 строк и не более ??
...
Рейтинг: 0 / 0
BULK INSERT
    #39944137
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
Отсутствие текста ошибки не говорит об отсутствии ошибки.
Пустой трай-кэтч - идеальный паттерн программирования! :-)

Я бы джуниорам просто запрещал бы несколько лет писать слово TRY, пока у них не наберётся опыта.
Сделал бы поиск в закоммиченом коде, и дни, когда был написан TRY, не оплачивал.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944138
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
FIRSTROW = 205778



и получаю:
авторСообщение 4832, уровень 16, состояние 1, строка 21
Массовая загрузка: непредвиденный конец файла данных.
Сообщение 7399, уровень 16, состояние 1, строка 21
Поставщик OLE DB "BULK" для связанного сервера "(null)" сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Сообщение 7330, уровень 16, состояние 2, строка 21
Не удалось получить строку от поставщика OLE DB "BULK" для связанного сервера "(null)".


Код: sql
1.
FIRSTROW = 205779


авторСообщение 4832, уровень 16, состояние 1, строка 21
Массовая загрузка: непредвиденный конец файла данных.
Сообщение 7301, уровень 16, состояние 2, строка 21
Не удалось получить требуемый интерфейс ("IID_IColumnsInfo") от поставщика OLE DB "BULK" для связанного сервера "(null)".

Файл совершенно не выглядит битым

Попробую файл в эксцеле открыть с разделителями
...
Рейтинг: 0 / 0
BULK INSERT
    #39944139
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
Первый файл импортируется нормально и без проблем.
Второй не импортируется.
SHKoder
Файл совершенно не выглядит битым

Посмотрите, чем отличаются 2 файла, особенно плохой файл в строке 205779
У вас, если вы работаете с файлами, должен быть нормальный редактор, смотреть байты.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944140
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот же файл подсунул в эксцель
Да, здесь разделитель знак решетки
Для MSSQL файл импорта делал с подменой разделителя на вертикальную черту.

В итоге со знаком решетки тоже не загружается, проблема остается той же.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944141
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и второй шаг парсинга в эксцеле
...
Рейтинг: 0 / 0
BULK INSERT
    #39944142
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
[src]
FIRSTROW = 205778
Файл совершенно не выглядит битым

Попробую файл в эксцеле открыть с разделителями


LASTROW = last_row. Указывает номер последней строки для загрузки. Значение по умолчанию 0, что обозначает последнюю строку в указанном файле данных

Блин, ну чо проще получить номер битой строки?
...
Рейтинг: 0 / 0
BULK INSERT
    #39944143
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder,

Строка может быть кривая - с неверным количеством столбцов.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944144
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Блин, ну чо проще получить номер битой строки?
Номер же балк показывает. Нужно просто посмотреть на эту строку.

PS Впрочем, судя по всему, автор писатель, а не читатель.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944159
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я и читатель и писатель
просто не всегда включается логика даже в элементарных вещах, где логике перестает что либо поддаваться

я замылил файл
https://transfiles.ru/7fv8n

прошу помощи, знатоки...

,FIRSTROW = 1
,LASTROW = 5
успешно грузятся

,FIRSTROW = 5
,LASTROW = 6
с ошибкой:
авторСообщение 4832, уровень 16, состояние 1, строка 3
Массовая загрузка: непредвиденный конец файла данных.
Сообщение 7399, уровень 16, состояние 1, строка 3
Поставщик OLE DB "BULK" для связанного сервера "(null)" сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Сообщение 7330, уровень 16, состояние 2, строка 3
Не удалось получить строку от поставщика OLE DB "BULK" для связанного сервера "(null)".


,FIRSTROW = 8
,LASTROW = 9
уже другая ошибка:
авторСообщение 4832, уровень 16, состояние 1, строка 3
Массовая загрузка: непредвиденный конец файла данных.
Сообщение 7301, уровень 16, состояние 2, строка 3
Не удалось получить требуемый интерфейс ("IID_IColumnsInfo") от поставщика OLE DB "BULK" для связанного сервера "(null)".

однако, если из файла удаляю строки с 1 по 8 включительно, то строки загружаются. НО ТРИ! хотя в файле их еще девять!!
о_О
...
Рейтинг: 0 / 0
BULK INSERT
    #39944160
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
однако, если из файла удаляю строки с 1 по 8 включительно, то строки загружаются. НО ТРИ! хотя в файле их еще девять!!
о_О
Мда, не могу найти закономерности...

А если 6-ю строчку переставить первой, будет ошибка?

Разделитель то у вас в скрипте какой, надеюсь, поменяли на #?

Выложите скрипт и create table, для этого вашего файла-примера.

SHKoder
я замылил файл
https://transfiles.ru/7fv8n
В окне написания поста есть кнопка для вложения файла.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944162
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
Код: sql
1.
CODEPAGE = '65001', 

А почему 65001, у вас же 1251?
...
Рейтинг: 0 / 0
BULK INSERT
    #39944164
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
удалил из файла строку, которая определяет наименования полей в импортируемой таблице.
и всё отлично залилось.

всем огромное спасибо за участие!
...
Рейтинг: 0 / 0
BULK INSERT
    #39944165
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, ну и таблицу приемник пересоздал. видимо в нем что-то было криво
...
Рейтинг: 0 / 0
BULK INSERT
    #39944167
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
SHKoder
Код: sql
1.
CODEPAGE = '65001', 

А почему 65001, у вас же 1251?

В оригинале 65001. А после моих редактирований, видимо стал 1251. Извините, упустил этот момент.

Про решётку писал выше, что на первоисточнике была #, потом поменял ее на вертикальную черту ,чтобы воспользоваться инструментом массовой загрузки. Начал делать скрипты под измененный файл. Но в итоге вернулся к первоисточнику с решёткой.
...
Рейтинг: 0 / 0
BULK INSERT
    #39944168
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHKoder
удалил из файла строку, которая определяет наименования полей в импортируемой таблице.
Так для этого было достаточно указать FIRSTROW =1, разве нет?
Может, всё таки дело было в таблице, непонятно...
...
Рейтинг: 0 / 0
BULK INSERT
    #39944169
SHKoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я использовал таблицу, которую создал мастер "Импорт и Экспорт данных MSSQL..."

в первую очередь я пробовал им сделать заливку. Но он выругался, что ему такой файл не поднять. И я начал вспоминать как это было в BCP, но прав не хватило включить xp_cmdshell.
Тогда я обратился к BULK INSERT и поленился создать свою таблицу. Подумал, что приемник же уже есть, который создал визард. И пытался данные впихнуть в эту таблицу.

По Вашему совету я полез в скрипт и пересоздал таблицу.

В файле, который Вам раньше выслал не было шапки и делать FIRSTROW отпала необходимость и он полностью залился в пересозданную таблицу.

Тогда я вернулся к файлам первоисточникам. Снес в них первую строку (шапку) и они закачались идеально.

В ночь уже не буду колдовать, но в следующий раз попробую не сносить шапку, а укажу FIRSTROW = 2

Еще раз огромное спасибо за напутствия. Хотя проблема осталась не ясной.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / BULK INSERT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]