SQL Server BCP导出损坏的文件?

use*_*351 4 sql-server export bcp corrupt file

我在SQL Server 2012中的BCP功能有一个小问题.事情是:我使用以下命令加载.jpg图像(大小为167KB):

INSERT [tabela_testowa](数据)SELECT*FROM OPENROWSET(BULK N'C:\ foty\ch6_MagicShop.jpg',SINGLE_BLOB)a;

然后我尝试使用以下方法将其导出回磁盘:

BCP"SELECT data FROM tabela_testowa WHERE ID = 1"queryout"C:\ test\file.jpg"-T -n -d test

文件保存在磁盘上没有问题,大小也是167 KB但是..它不能像原始副本一样打开.我不知道BCP导出中有什么参数错误吗?或者它可能在导入阶段被破坏?有人有类似的问题吗?

Con*_*nor 9

感谢上帝,感谢@ user_0回答和@ user3494351的神秘回答和评论以及这个古老的论坛帖子,经过几个小时的撞击我的头后,我终于想到了这一点.

问题是BCP默认情况下喜欢在文件中添加额外的8个字节.如果您只使用native -n标志,这会破坏文件并使其无法打开.

但是,BCP允许您指定格式文件作为输出,可以让您告诉它不要添加额外的8个字节.所以我在SQL Server中创建了一个表(在游标中使用),只有一行和一列我的二进制数据.运行第一个命令时,表必须存在.

首先在命令行中执行以下操作:

bcp MyDatabase.MySchema.MyTempTable format nul -T -n -f formatfile.fmt
Run Code Online (Sandbox Code Playgroud)

这会在您所在的目录中创建formatfile.fmt.我在E:\ drive上创建了.这是它的样子:

10.0
1
1       SQLBINARY           8       0       ""   1     MyColumn             ""
Run Code Online (Sandbox Code Playgroud)

那8个就是变量,bcp表示要添加到文件中的字节数.这是一个破坏你的文件的混蛋.将该吸盘更改为0:

10.0
1
1       SQLBINARY           0       0       ""   1     MyColumn             ""
Run Code Online (Sandbox Code Playgroud)

现在只需运行您的BCP脚本,删除-n标志并包含-f标志:

bcp "SELECT MyColumn FROM MyDatabase.MySchema.MyTempTable" queryout "E:\MyOutputpath" -T -f E:\formatfile.fmt
Run Code Online (Sandbox Code Playgroud)


use*_*351 2

好的,我解决了这个问题。必须使用 -f 和文件路径添加格式文件。它可以通过运行不带任何格式的 bcp 来创建,并命令它将格式文件保存到磁盘。那么我们就可以使用这个格式的文件,这样就不再需要回答这些问题了,而且文件本身没有额外的数据,可以毫无问题地打开