如何使用 BCP 或 Sql Server Management Studio 从 Sql Server 中获取 BLOB 数据?

Posted

技术标签:

【中文标题】如何使用 BCP 或 Sql Server Management Studio 从 Sql Server 中获取 BLOB 数据?【英文标题】:How do I use BCP or Sql Server Management Studio to get BLOB data out of Sql Server? 【发布时间】:2011-01-25 04:07:04 【问题描述】:

很抱歉,如果这个问题已经被问过,但我在任何地方都找不到。我有一个将文件存储为 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] 的长度: 输入字段终止符 [无]:

【问题讨论】:

【参考方案1】:

我正在回答我自己的问题,因为我对 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] 的长度: 输入字段终止符 [无]:

【讨论】:

【参考方案2】:

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

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

显然,您可以使用 BCP 和格式文件执行类似的操作,但 IIRC 格式文件必须预先填充它期望从列中提取的确切字节数,这使得它非常不切实际。

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

【讨论】:

我是 Aaron,实际上,我们 95% 的应用程序都将所有文档存储在文件系统上。虽然有一点仍然使用 blob :( 格式文件不需要预先填充字段长度;以下对我有用(9.0 和以下1 之后的换行符):9.0 1 1 SQLBINARY 0 0 "" 1 col1 "" @aaron - 显然将 varbinary (max) 导出到文件存在很多问题。 (我刚刚用 c# 完成了它 - 在尝试用 BCP 完成 3 小时后)。 (问题在于 refix-length of field document_binary 应该设置为 0 - 但它需要用户交互。)也可以使用 FMT 文件完成。但是如果我无权访问 FMT 文件怎么办?有没有办法在 bcp 命令中“内联使用” fmt 内容?

以上是关于如何使用 BCP 或 Sql Server Management Studio 从 Sql Server 中获取 BLOB 数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 bcp 将 blob 文件列表导入 SQL Server

sqlserver的BCP导入导出

SQL Server根据表或视图批量生成插入语句并BCP导出成文本

如何删除双引号并跳过 bcp 加载到 SQL Server 中的最后 3 行?

SQL Server BCP 资料导入导出

SQL Server 2005 使用 bcp 写入文件