2010-03-08 58 views
9

对不起,如果这个问题已被问到,但我找不到任何地方。我有一个表将文件存储为BLOBS。保存文件的列是图像数据类型。我希望能够从列中提取二进制数据并将其转换为实际文件。如果可能,我希望能够在BCP或管理工作室做到这一点。如何使用BCP或Sql Server Management Studio将BLOB数据从Sql Server中取出?

我尝试过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]: 

回答

20

我回答我的问题,因为我越来越恼火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 
 
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

如果你可以使用C#/。NET代码要做到这一点,以下KB文章可能会派上用场:

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

显然,你可以做这样的事情与BCP和格式文件,但IIRC格式文件必须预先填入它期待的确切字节数从列中拉出来,这使得它非常不切实际。

您可能会选择的另一种选择是在2008年使用FILESTREAM,或者如果您不打算在近期内迁移到2008年,则将文档存储在文件系统中并将指针存储在数据库中。是的,这有利有弊,但这是我们迄今在所有项目中选择的方式。

+0

我亚伦,我们实际上做的所有的文件存储在文件系统95我们的应用程序的%。有一点仍然使用blob:( – Eric 2010-03-08 21:14:47

+0

)您不需要预先填充字段长度的格式文件;下面的代码适用于我(在'9.0'和后面的'1'之后的换行符): '9.0 1 SQLBINARY 0 0“”1 col1“”' – Geoff 2013-05-13 20:22:40

+0

@aaron - 显然在将varbinary(max)导出到文件时存在很多问题(我刚刚用c#完成了这项工作--3小时后尝试(使用BCP做)(问题在于'ref_length_field_file_binary'应该设置为'0' - 但它需要用户交互)。它也可以用FMT文件完成。但是如果我没有访问FMT文件?有没有办法在bcp命令中“内联使用”fmt内容? – 2013-12-10 14:43:06

相关问题