powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Импорт 150-ти тысяч файлов с длинной тропинкой в базу
23 сообщений из 23, страница 1 из 1
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077809
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Пытаюсь импортировать файлы в таблицу с поддержкой 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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077810
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m

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

Спасибо.


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

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

Спасибо.


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


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

При таком методе максимальная длина тропинки плюс длина имени файла 235. Если я копирую папку на локальный диск, то удается скопировать файлы с длинной полного имени (тропинка плюс имя файла) до 258.
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077812
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 появляется? Если нет, что пишет?
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077813
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077814
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m

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


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

Как вариант можете попробовать использовать команду subst - это позволит сократить путь.
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077816
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077818
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
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077819
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для особо упертых есть ишо имена 8.3.
Но на новых версиях осей - это надо включать.
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077820
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077821
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Для особо упертых есть ишо имена 8.3.
Но на новых версиях осей - это надо включать.


Как это мне может помочь? Все файлы на файловом сервере. Включать там что-либо я не могу. Существующие файлы/папки переименовывать я тоже не могу.
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077826
bantik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077828
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077845
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077855
bantik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Импорт 150-ти тысяч файлов с длинной тропинкой в базу
    #40077865
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,

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

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

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

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


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


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

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

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


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


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


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

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

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

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



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

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

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



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

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


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