Вопрос или проблема
Я пытаюсь использовать Bulk Copy Program для извлечения данных из столбца VARBINARY в моей базе данных, а затем загружать файлы различных типов (PDF, XLS, TIF и т. д.) на жесткий диск пользователя.
Сначала я не мог генерировать файлы, которые я мог бы открыть, из-за повреждения данных. После того как я начал использовать файл формата XML, я смог генерировать и загружать PDF-файлы, которые открываются нормально, но с XLS, TIF и т. д. по-прежнему возникают проблемы, из-за чего файл либо не открывается, либо, если открывается, он практически нечитаем. Документы Word открываются нормально, но при этом появляется предупреждение о том, что ‘Word обнаружил нечитаемый контент’.
Вот содержимое моего файла формата:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="7" xsi:type="NativePrefix" PREFIX_LENGTH="8"/>
</RECORD>
<ROW>
<COLUMN SOURCE="7" NAME="CONTENT" xsi:type="SQLBINARY"/>
</ROW>
</BCPFORMAT>
А вот команда, которую я использую:
bcp "select CONTENTS from DOCUMENT_TABLE where DOC_ID = 123" queryout "C:\users\fred\bcp_files\BCP_results.xls" -c -d MyDatabase -S MyDatabaseServer -f "C:\Users\fred\bcp_files\format_file.xml"
Как я уже говорил, с PDF-файлами все хорошо; данные повреждаются при работе с большинством других форматов.
Есть какие-нибудь предложения?
Спасибо
Ответ или решение
К сожалению, возникшие проблемы с целостностью данных при использовании Bulk Copy Program (BCP) для экспорта файлов, таких как XLS и TIF, достаточно распространены, особенно когда дело касается двоичных данных (VARBINARY). При правильном подходе можно значительно улучшить ситуацию. Позвольте предложить несколько шагов, которые помогут вам решить проблему.
1. Используйте "binary" или "varbinary" формат
Во-первых, учитывайте, что формат вывода для двоичных данных должен соответствовать их типу. Вместо использования текста с параметром -c
, попробуйте использовать формат -binary
или -varbinary
. Это может помочь избежать повреждения данных, так как вы сохранили бы данные в том же формате, в котором они хранятся в базе.
2. Обновите форматный файл
Поскольку вы используете XML-файл для формата, убедитесь, что он корректно настроен для вашего типа данных. Попробуйте следующий обновленный форматный файл:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="NativePrefix" PREFIX_LENGTH="8"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="CONTENT" xsi:type="SQLBINARY"/>
</ROW>
</BCPFORMAT>
3. Проверьте свой запрос
Убедитесь, что данные, которые вы получаете из запроса, корректны и соответствуют целевым файлам. Выполните запрос напрямую в вашем SQL-клиенте и экспортируйте содержимое в файл, чтобы убедиться, что изначальные данные не повреждены.
SELECT CONTENTS FROM DOCUMENT_TABLE WHERE DOC_ID = 123
4. Использование командной строки BCP
Убедитесь, что ваш вызов BCP корректен. Попробуйте изменить параметры на следующие:
bcp "SELECT CONTENTS FROM DOCUMENT_TABLE WHERE DOC_ID = 123" queryout "C:\users\fred\bcp_files\BCP_results.xlsx" -f "C:\Users\fred\bcp_files\format_file.xml" -B -S MyDatabaseServer -d MyDatabase -T
Здесь:
-B
флаг позволяет вставить строки с двоичными данными, если это необходимо.- Убедитесь, что путь к файлу не содержит пробелов или некорректных символов, которые могут привести к сбоям.
5. Проверьте кодировку
Иногда проблема может заключаться не только в способе экспорта данных, но и в неверной кодировке. Удостоверьтесь в том, что ваш текстовый редактор или программа для просмотра файлов поддерживает необходимую кодировку.
6. Попробуйте использовать альтернативные методы
Если проблема не устраняется, возможно, стоит рассмотреть альтернативные методы экспорта данных, такие как использование SQL Server Management Studio (SSMS) для экспорта данных в нужные форматы, или написать небольшую программу на C# или Python, которая могла бы извлекать данные и сохранять их.
Следуя этим рекомендациям, вы сможете избавиться от проблем с повреждением файлов при использовании BCP для экспорта данных из VARBINARY колонн. Если у вас возникнут дополнительные вопросы, пожалуйста, не стесняйтесь их задавать.