Как использовать BCP или Sql Server Management Studio для получения BLOB-данных с Sql Server? - PullRequest
11 голосов
/ 09 марта 2010

Извините, если этот вопрос уже задавался, но я нигде не смог его найти. У меня есть таблица, в которой хранятся файлы как 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 native. Кроме того, 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]:

Ответы [ 2 ]

24 голосов
/ 06 апреля 2010

Я отвечаю на свой вопрос, так как меня раздражает, что ТАК говорит мне назначить награду

Оказывается, вам не нужен флаг -n native. Кроме того, 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]:
0 голосов
/ 09 марта 2010

Если вы можете использовать для этого код C # / .NET, может пригодиться следующая статья в КБ:

http://support.microsoft.com/kb/317016

Очевидно, что вы можете сделать что-то подобное с BCP и файлом формата, но IIRC файл формата должен быть предварительно заполнен точным количеством байтов, которые он ожидает извлечь из столбца, что делает его весьма непрактичным.

Другой вариант, который вы можете выбрать, - это использовать FILESTREAM в 2008 году или, если вы не планируете переходить на 2008 год в ближайшее время, сохранить документы в файловой системе и указатель на них в базе данных. Да, в этом есть свои плюсы и минусы, но на сегодняшний день мы выбрали именно такой подход во всех проектах.

...