Как использовать BCP или Sql Server Management Studio для получения данных BLOB из Sql Server?
-
18-09-2019 - |
Вопрос
Извините, если этот вопрос уже задавался, но я нигде не смог его найти.У меня есть таблица, в которой файлы хранятся в виде BLOBS.Столбец, содержащий файл, имеет тип данных изображения.Я хотел бы иметь возможность извлечь двоичные данные из столбца и превратить их в реальный файл.В идеале мне бы хотелось сделать это с помощью BCP или студии управления, если это возможно.
Я пробовал BCP, но по какой-то причине, когда я пытаюсь извлечь офисный документ, Word считает, что он поврежден.Вот что я пробовал до сих пор (очевидно, значения были изменены для защиты невиновных :):
bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -n -S server -U username -P password
Это ведь не работает?Есть предположения?
Редактировать Оказывается, вам не нужен собственный флаг -n.Кроме того, BCP пытается по умолчанию включить в столбец изображения 4-байтовый префикс — на самом деле вам нужно установить для него значение 0.
bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password
Enter the file storage type of field document_binary [image]: Enter prefix-length of field document_binary [4]: 0 Enter length of field document_binary [0]: Enter field terminator [none]:
Решение
Я отвечаю на свой вопрос, так как меня раздражает, что ТАК говорит мне установить награду.
Оказывается, вам не нужен собственный флаг -n.Кроме того, BCP пытается по умолчанию включить в столбец изображения 4-байтовый префикс — на самом деле вам нужно установить для него значение 0.
bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password
Enter the file storage type of field document_binary [image]: Enter prefix-length of field document_binary [4]: 0 Enter length of field document_binary [0]: Enter field terminator [none]:
Другие советы
Если вы можете использовать для этого код C#/.NET, вам может пригодиться следующая статья базы знаний:
http://support.microsoft.com/kb/317016
Очевидно, вы можете сделать что-то подобное с BCP и файлом формата, но IIRC файл формата должен быть предварительно заполнен точным количеством байтов, которые он ожидает получить из столбца, что делает это совершенно непрактичным.
Другой вариант, который вы можете выбрать, — использовать FILESTREAM в 2008 году или, если вы не планируете мигрировать на 2008 год в ближайшее время, хранить документы в файловой системе, а указатель на них — в базе данных.Да, в этом есть свои плюсы и минусы, но на сегодняшний день именно этот путь мы выбрали во всех проектах.