Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Импорт 150-ти тысяч файлов с длинной тропинкой в базу / 23 сообщений из 23, страница 1 из 1
16.06.2021, 03:34
    #40077809
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Добрый день,

Пытаюсь импортировать файлы в таблицу с поддержкой filestream. Гоняю по списку всех файлов запросы типа:

Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO [MyDB].[dbo].[MyTable] (UI, [FolderName], [FileName], [FullFileName], FS_Data) VALUES (NEWID()
    ,'\\Server\Folder\subfolder1\...\subfolder7', 
	'Very ._Long file name.pdf', 
	'\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', 
	(SELECT * FROM OPENROWSET(BULK N'\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', SINGLE_BLOB) AS ImpFile));
    GO



Некоторые файлы, у который длинные имена выдают такую ошибку:
Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf" could not be opened. Operating system error code (null).


Есть ли предел у длины тропинки или имени файла для запроса выше? Если есть, то какой он? У меня максимальная длина тропинки плюс имя файла равна 308. Если я скопирую папку которая меня интересует на локальный диск, то смогу сократить длину полного имени файла на 37 символов. Не уверен, что этого будет достаточно.

Как еще можно обойти такое ограничение?

Спасибо.
...
Рейтинг: 0 / 0
16.06.2021, 04:08
    #40077810
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m

Как еще можно обойти такое ограничение?

Спасибо.


Попробуйте добавить \\?\unc :
\\?\unc\server\share.....
...
Рейтинг: 0 / 0
16.06.2021, 04:31
    #40077811
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
x1ca4064
Roust_m

Как еще можно обойти такое ограничение?

Спасибо.


Попробуйте добавить \\?\unc :
\\?\unc\server\share.....


Не помогает. Даже если я скопирую папки на локальный диск, то некоторые файлы с длинной тропинкой не импортируются.

При таком методе максимальная длина тропинки плюс длина имени файла 235. Если я копирую папку на локальный диск, то удается скопировать файлы с длинной полного имени (тропинка плюс имя файла) до 258.
...
Рейтинг: 0 / 0
16.06.2021, 04:38
    #40077812
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m

Не помогает. Даже если я скопирую папки на локальный диск, то некоторые файлы с длинной тропинкой не импортируются.


Что происходит, когда выполняете команду (в cmd):
copy \\?\unc\server\folder\...\"Very ._Long file name.pdf" 000
или
copy "\\?\unc\server\folder\...\Very ._Long file name.pdf" 000

Файл 000 появляется? Если нет, что пишет?
...
Рейтинг: 0 / 0
16.06.2021, 04:47
    #40077813
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
x1ca4064
Roust_m

Не помогает. Даже если я скопирую папки на локальный диск, то некоторые файлы с длинной тропинкой не импортируются.


Что происходит, когда выполняете команду (в cmd):
copy \\?\unc\server\folder\...\"Very ._Long file name.pdf" 000
или
copy "\\?\unc\server\folder\...\Very ._Long file name.pdf" 000

Файл 000 появляется? Если нет, что пишет?


Пишет в обоих случаях:
The specified path is invalid.

Но если сделать:
copy \\server\folder\...\"Very ._Long file name.pdf" 000
То появляется файл.
...
Рейтинг: 0 / 0
16.06.2021, 05:14
    #40077814
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m

Но если сделать:
copy \\server\folder\...\"Very ._Long file name.pdf" 000
То появляется файл.


Это говорит о том, что этот путь короче 260 символов.
Для проверки я создал путь+имя длиной 483 символа: cmd не может принять такую длину, но программно такой файл открывается (с использованием \\?\unc), поэтому сервер тоже должен это мочь.

Как вариант можете попробовать использовать команду subst - это позволит сократить путь.
...
Рейтинг: 0 / 0
16.06.2021, 06:04
    #40077816
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
x1ca4064
Roust_m

Но если сделать:
copy \\server\folder\...\"Very ._Long file name.pdf" 000
То появляется файл.


Это говорит о том, что этот путь короче 260 символов.
Для проверки я создал путь+имя длиной 483 символа: cmd не может принять такую длину, но программно такой файл открывается (с использованием \\?\unc), поэтому сервер тоже должен это мочь.

Как вариант можете попробовать использовать команду subst - это позволит сократить путь.


Мне не нужно открыть файл, мне его нужно вставить в таблицу базы. Как мне сделать чтобы запрос ниже работал с длинными именами/тропинками:
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO [MyDB].[dbo].[MyTable] (UI, [FolderName], [FileName], [FullFileName], FS_Data) VALUES (NEWID()
    ,'\\Server\Folder\subfolder1\...\subfolder7', 
	'Very ._Long file name.pdf', 
	'\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', 
	(SELECT * FROM OPENROWSET(BULK N'\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', SINGLE_BLOB) AS ImpFile));
    GO


?
...
Рейтинг: 0 / 0
16.06.2021, 06:42
    #40077818
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m

Мне не нужно открыть файл, мне его нужно вставить в таблицу базы.

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

Как мне сделать чтобы запрос ниже работал с длинными именами/тропинками

Попробуйте:
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO [MyDB].[dbo].[MyTable] (UI, [FolderName], [FileName], [FullFileName], FS_Data) VALUES (NEWID()
    ,'\\Server\Folder\subfolder1\...\subfolder7', 
	'Very ._Long file name.pdf', 
	'\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', 
	(SELECT * FROM OPENROWSET(BULK N'\\?\unc\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', SINGLE_BLOB) AS ImpFile));
    GO
...
Рейтинг: 0 / 0
16.06.2021, 07:12
    #40077819
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Для особо упертых есть ишо имена 8.3.
Но на новых версиях осей - это надо включать.
...
Рейтинг: 0 / 0
16.06.2021, 07:33
    #40077820
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
x1ca4064
Roust_m

Мне не нужно открыть файл, мне его нужно вставить в таблицу базы.

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

Как мне сделать чтобы запрос ниже работал с длинными именами/тропинками

Попробуйте:
Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO [MyDB].[dbo].[MyTable] (UI, [FolderName], [FileName], [FullFileName], FS_Data) VALUES (NEWID()
    ,'\\Server\Folder\subfolder1\...\subfolder7', 
	'Very ._Long file name.pdf', 
	'\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', 
	(SELECT * FROM OPENROWSET(BULK N'\\?\unc\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf', SINGLE_BLOB) AS ImpFile));
    GO



Не помогает:
Msg 4861, Level 16, State 1, Line 16
Cannot bulk load because the file "\\?\unc\Server\Folder\subfolder1\...\subfolder7\testttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt.txt" could not be opened. Operating system error code (null).

При этом файл с именем "testttttttttttttttttttttttttttttttttttttttt.txt" в той же папке прекрасно вставляется в таблицу.
...
Рейтинг: 0 / 0
16.06.2021, 07:35
    #40077821
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
aleks222
Для особо упертых есть ишо имена 8.3.
Но на новых версиях осей - это надо включать.


Как это мне может помочь? Все файлы на файловом сервере. Включать там что-либо я не могу. Существующие файлы/папки переименовывать я тоже не могу.
...
Рейтинг: 0 / 0
16.06.2021, 08:22
    #40077826
bantik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m
aleks222
Для особо упертых есть ишо имена 8.3.
Но на новых версиях осей - это надо включать.


Как это мне может помочь? Все файлы на файловом сервере. Включать там что-либо я не могу. Существующие файлы/папки переименовывать я тоже не могу.


А запустить внешний командник , который будет перебирать файлы и последовательно запускать скрипт. не судьба ? В том числе и переименовывать файл
Типа
Код: powershell
1.
for %f in (*.pdf ) do copy %f C:\A.PDF & start /wait c:\loadsql.cmd c:\A.PDF


ну или выбрать длинные имена, и уже попросить автора их сделать покороче. типа
Код: powershell
1.
dir c:\*.pdf /s /b | sort /+250 /r > LongName.txt



На худой конец сделать в команднике короткий линк . типа
Код: powershell
1.
mklink /D "C:\короткий путь" "C:\Share\WINDOW~1\ C73D~1\C6BF~1\D915~1\5C04~1\B4E5~1\260MIC~1"
...
Рейтинг: 0 / 0
16.06.2021, 08:45
    #40077828
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
bantik
Roust_m
пропущено...


Как это мне может помочь? Все файлы на файловом сервере. Включать там что-либо я не могу. Существующие файлы/папки переименовывать я тоже не могу.


А запустить внешний командник , который будет перебирать файлы и последовательно запускать скрипт. не судьба ? В том числе и переименовывать файл
Типа
Код: powershell
1.
for %f in (*.pdf ) do copy %f C:\A.PDF & start /wait c:\loadsql.cmd c:\A.PDF


ну или выбрать длинные имена, и уже попросить автора их сделать покороче. типа
Код: powershell
1.
dir c:\*.pdf /s /b | sort /+250 /r > LongName.txt



На худой конец сделать в команднике короткий линк . типа
Код: powershell
1.
mklink /D "C:\короткий путь" "C:\Share\WINDOW~1\ C73D~1\C6BF~1\D915~1\5C04~1\B4E5~1\260MIC~1"



Ничего переименовывать я не могу и просить авторов это сделать тоже, ибо файлов около 150-ти тысяч и в имени файла зашито его предназначение. При переименовании эта информация потеряется. Линки создавать при таком количестве файлов тоже не вижу смысла. Структуру папок надо тоже сохранить. Я думаю, что при длине полного имение файла больше некоторого порогового значения просто копировать файл на локальный диск и оттуда его в базу вставлять. А тропинку при этом записывать старую.
...
Рейтинг: 0 / 0
16.06.2021, 10:02
    #40077845
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
...
Рейтинг: 0 / 0
16.06.2021, 10:53
    #40077855
bantik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m
bantik
пропущено...

На худой конец сделать в команднике короткий линк . типа
Код: powershell
1.
mklink /D "C:\короткий путь" "C:\Share\WINDOW~1\ C73D~1\C6BF~1\D915~1\5C04~1\B4E5~1\260MIC~1"



Ничего переименовывать я не могу и просить авторов это сделать тоже, ибо файлов около 150-ти тысяч и в имени файла зашито его предназначение. При переименовании эта информация потеряется. Линки создавать при таком количестве файлов тоже не вижу смысла. Структуру папок надо тоже сохранить. Я думаю, что при длине полного имение файла больше некоторого порогового значения просто копировать файл на локальный диск и оттуда его в базу вставлять. А тропинку при этом записывать старую.


То что вы делаете - по сути обычный ETL "геморрой". И есть куча инструментов для профессиональной работы. потому как вы все равно потом придете что нужен более сложный процесс - типа - инкрементальная загрузка, многопоточный запуск, запуск по расписанию и пр. Если идти step by step то придется все выбрасывать и начинать с нуля, как только появится новая проблема. Или писать свой "велосипедик" и постоянно его поддерживать. вот я и говорю - зачем - если есть PowerCenter и PowerMart от Informatica, IBM Data Stage и Data Manager, SSIS от Microsoft и пр
...
Рейтинг: 0 / 0
16.06.2021, 11:35
    #40077865
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m,

у Вас символы пробела в именах, попробуйте заключить строку в двойные кавычки

N'"\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf"'
...
Рейтинг: 0 / 0
17.06.2021, 03:46
    #40078133
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Владислав Колосов
Roust_m,

у Вас символы пробела в именах, попробуйте заключить строку в двойные кавычки

N'"\\Server\Folder\subfolder1\...\subfolder7\Very ._Long file name.pdf"'


Дело не в этом, я в скрипт вогнал условие, если длина полного (с папкой) имени файл больше 240 символов, то скопировать этот файл в локальную папку "C:\tmp\" и вставить файл оттуда. Все сразу заработало. При этом в таблицу я вставляю исходную папку с длинным именем.
...
Рейтинг: 0 / 0
17.06.2021, 03:52
    #40078134
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу


Да, я уже понял, что дело в длине имени папки и файла. Хорошо знать значение лимита. Как ни странно "\\?\UNC\server\" не помогает. Можно попробовать поменять эту настройку в реестре. Я пока в скрипт включил условие, что если длина имени файла больше определенного значения, то сначала скопировать этот файл в локальную папку и потом импортировать. Таких файлов всего несколько сотен. Как workaround пока подходит.
...
Рейтинг: 0 / 0
17.06.2021, 07:14
    #40078143
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Ваще, тредстартер херней мается. Не он один, канешно.

1. Делаем FileTable
2. Разрешаем нетранзакционный доступ.
3. XCOPY.exe справится.
4. Бинго!

ЗЫ. У FileTable есть недокументированная возможность экономить место - можно включить сжатие файловой системы NTFS. И наслаждаться...
...
Рейтинг: 0 / 0
17.06.2021, 07:19
    #40078145
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Трехкратная экономия...
...
Рейтинг: 0 / 0
17.06.2021, 08:49
    #40078152
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
bantik
Roust_m
пропущено...


Ничего переименовывать я не могу и просить авторов это сделать тоже, ибо файлов около 150-ти тысяч и в имени файла зашито его предназначение. При переименовании эта информация потеряется. Линки создавать при таком количестве файлов тоже не вижу смысла. Структуру папок надо тоже сохранить. Я думаю, что при длине полного имение файла больше некоторого порогового значения просто копировать файл на локальный диск и оттуда его в базу вставлять. А тропинку при этом записывать старую.


То что вы делаете - по сути обычный ETL "геморрой". И есть куча инструментов для профессиональной работы. потому как вы все равно потом придете что нужен более сложный процесс - типа - инкрементальная загрузка, многопоточный запуск, запуск по расписанию и пр. Если идти step by step то придется все выбрасывать и начинать с нуля, как только появится новая проблема. Или писать свой "велосипедик" и постоянно его поддерживать. вот я и говорю - зачем - если есть PowerCenter и PowerMart от Informatica, IBM Data Stage и Data Manager, SSIS от Microsoft и пр


У меня разовая задача проанализировать какие файлы есть, выбрать из них определенную категорию, например сертификаты по оказанию первой помощи и скормить Amazon для распознавания текста, чтобы найти у кого сертификат действующий а у кого истек.

База плюс немного кода в PowerShell с этим прекрасно справятся.
...
Рейтинг: 0 / 0
17.06.2021, 08:51
    #40078153
Roust_m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
aleks222
Ваще, тредстартер херней мается. Не он один, канешно.

1. Делаем FileTable
2. Разрешаем нетранзакционный доступ.
3. XCOPY.exe справится.
4. Бинго!

ЗЫ. У FileTable есть недокументированная возможность экономить место - можно включить сжатие файловой системы NTFS. И наслаждаться...



Это неплохая идея, интересно, а в этом случае нет ограничения на длину тропинки и файла?
...
Рейтинг: 0 / 0
17.06.2021, 10:34
    #40078187
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
Roust_m
aleks222
Ваще, тредстартер херней мается. Не он один, канешно.

1. Делаем FileTable
2. Разрешаем нетранзакционный доступ.
3. XCOPY.exe справится.
4. Бинго!

ЗЫ. У FileTable есть недокументированная возможность экономить место - можно включить сжатие файловой системы NTFS. И наслаждаться...



Это неплохая идея, интересно, а в этом случае нет ограничения на длину тропинки и файла?

Наивный чукотский юноша.
Ограничения на длину пути заштопаны в глубины ОСи.
Еще со времен MS DOS.
В FileTable тоже есть ограничения.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Импорт 150-ти тысяч файлов с длинной тропинкой в базу / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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