2014-12-04 3 views
1

я есть небольшая проблема с функциональностью BCP в SQL Server 2012. То есть: им загрузки .jpg изображение (167Kb по размеру), используя команду ниже:SQL Server BCP экспортирует поврежденный файл?

ВСТАВИТЬ [tabela_testowa] (Данные) SELECT * FROM OPENROWSET (BULK N'C: \ foty \ ch6_MagicShop.jpg ', SINGLE_BLOB) a;

, а затем им пытаются экспортировать его обратно на диск с помощью:

BCP "Выберите данные из tabela_testowa WHERE ID = 1" queryout "C: \ Test \ file.jpg" -T -n -d тест

Файл сохраняется на диске без проблем, размер также 167 KB, но .. он не может быть открыт, как оригинальная копия. Я не знаю, что-то не так в BCP-экспорте? Или, может быть, он поврежден на стадии импорта? У кого-то были похожие проблемы?

ответ

1

ОК, поэтому я решил проблему. Файл формата должен быть добавлен с использованием -f и пути к файлу. Его можно создать путем запуска bcp без какого-либо формата и заказать его для сохранения файла формата на диск. Затем мы можем использовать этот файл формата, чтобы он больше не нуждался в ответах на эти вопросы, а сам файл не имеет дополнительных данных и может быть открыт без проблем.

1

BCP добавляет информацию в свой файл. Всего несколько данных, но вы не экспортируете только файл jpg.

Вы говорите 167 KB, но смотрите реальные байты, а не округленное измерение. Будет разница.

Вы не можете экспортировать изображение через BCP.

+0

ОК, так вот в чем дело.Если я запустил bcp из командной строки без указанного формата (поэтому no -n) им задали 4 вопроса: тип хранилища файлов, префикс-длина, длина данных поля и в конце, если я хочу сохранить эту информацию в файле , Если я выберем как длину префикса 0 и длину поля 0, а в конце, я отвечу, что он не будет сохранен отлично и может быть открыт нормально. Однако как я могу это сделать без запроса этих ответов?/ – user3494351

+1

@ user_0 это неверно, вы можете экспортировать изображение, которое вам нужно установить для файла формата. См. Мой ответ ниже. – Conor

7

Благодарим бога, благодаря ответу @ user_0 и загадочному ответу и комментарию @ user3494351 this ancient forum post Я, наконец, понял это через несколько часов, ударив головой о стену.

Проблема в том, что BCP по умолчанию добавляет дополнительные 8 байтов в файл. Это искажает файл и делает невозможным его открытие, если вы используете только собственный флаг -n.

Тем не менее, BCP позволяет указать формат файла в виде вывода, который позволяет вам сказать ему, чтобы он не добавлял дополнительные 8 байтов. Таким образом, у меня есть таблица, которую я создал (которая будет использоваться в курсоре) на SQL Server, которая имеет только ОДИН ROW и ONE COLUMN с моими двоичными данными. Таблица должна существовать при запуске первой команды.

В командной строке первое, что нужно сделать это:

bcp MyDatabase.MySchema.MyTempTable format nul -T -n -f formatfile.fmt 

Это создает formatfile.fmt в каталоге вы находитесь, я сделал на E:. \ Диск. Вот как это выглядит:

10.0 
1 
1  SQLBINARY   8  0  "" 1  MyColumn    "" 

Это 8 право есть переменная, BCP говорит, сколько байтов, чтобы добавить в файл. Это ублюдок, который развращает ваши файлы. Перемена присоски к 0:

10.0 
1 
1  SQLBINARY   0  0  "" 1  MyColumn    "" 

Теперь просто запустить скрипт BCP, уронить флаг -n и включить флаг -f:

bcp "SELECT MyColumn FROM MyDatabase.MySchema.MyTempTable" queryout "E:\MyOutputpath" -T -f E:\formatfile.fmt 
+0

Если вы сталкиваетесь с проблемами ввода-вывода, относящимися к файлу '.fmt', убедитесь, что вы добавили n-новую строку в конец файла! Приведенные выше примеры не имеют их. Кроме того, решение работает! – avn

+0

Как ** Измените эту присоску на 0 ** –

+0

@avn, как вы имеете в виду добавить n в конец файла? где именно? –