12

很抱歉,如果这个问题已经被问过,但我在任何地方都找不到。我有一个将文件存储为 BLOBS 的表。保存文件的列是图像数据类型。我希望能够从列中提取二进制数据并将其转换为实际文件。如果可能的话,我希望能够通过 BCP 或管理工作室来做到这一点。

我尝试过 BCP,但由于某种原因,当我尝试拉出 Office 文档时,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
输入字段 document_binary [image] 的文件存储类型:
输入字段 document_binary [4] 的前缀长度:0
输入字段 document_binary [0] 的长度:
输入字段终止符 [无]:
4

2 回答 2

26

我正在回答我自己的问题,因为我对 SO 告诉我设置赏金感到恼火

原来你不需要 -n 本机标志。此外,默认情况下,BCP 尝试在图像列中包含 4 字节前缀 - 您实际上希望将此设置为 0。

bcp "select document_binary_data from database where id = 12345" queryout "c:\filename.doc" -S server -U username -P password
输入字段 document_binary [image] 的文件存储类型:
输入字段 document_binary [4] 的前缀长度:0
输入字段 document_binary [0] 的长度:
输入字段终止符 [无]:
于 2010-04-06T16:46:34.307 回答
0

如果您可以使用 C#/.NET 代码来执行此操作,那么以下知识库文章可能会派上用场:

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

显然你可以用 BCP 和格式文件做这样的事情,但是 IIRC 格式文件必须预先填充它期望从列中提取的确切字节数,这使得它非常不切实际。

您可能选择的另一个选项是在 2008 中使用 FILESTREAM,或者,如果您不打算很快迁移到 2008,请将文档存储在文件系统上,并将指向它们的指针存储在数据库中。是的,这有利有弊,但这是我们迄今为止在所有项目中选择的方式。

于 2010-03-08T21:09:46.263 回答