SQL Server BCP导出损坏的文件?

我在SQL Server 2012中有一个BCPfunction的小问题。事情是:使用下面的命令即时加载.jpg图像(167KB大小):

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

然后im试图导出回到磁盘使用:

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

文件得到保存在磁盘上没有问题,大小也是167 KB,但..它不能像原来的副本打开。 我不知道在BCP导出中有些参数是错误的吗? 或者也许在导入阶段被破坏? 任何人都有类似的问题?

感谢上帝,感谢@ user_0答案和@ user3494351的神秘答案和评论,而这个古老的论坛post,我终于把头撞到墙上几个小时后 ,才发现了这一点。

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

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

在命令行首先你需要这样做:

bcp MyDatabase.MySchema.MyTempTable format nul -T -n -f formatfile.fmt 

这将在您所在的目录中创buildformatfile.fmt。我在E:\ drive上执行了此操作。 以下是它的样子:

 10.0 1 1 SQLBINARY 8 0 "" 1 MyColumn "" 

那8就是那个variables,bcp表示有多less字节添加到你的文件中。 这是破坏你的文件的混蛋。 改变那个吸盘到0:

 10.0 1 1 SQLBINARY 0 0 "" 1 MyColumn "" 

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

 bcp "SELECT MyColumn FROM MyDatabase.MySchema.MyTempTable" queryout "E:\MyOutputpath" -T -f E:\formatfile.fmt 

BCP正在将信息添加到他的文件中。 只有很less的数据,但是你不是只输出一个JPG文件。

你说167 KB,但看真正的字节,而不是四舍五入的尺寸。 会有一个区别。

您不能通过BCP导出图像。

好的,我解决了这个问题。 格式文件必须使用-f和文件path添加。 它可以通过运行没有任何格式的bcp来创build,并命令它将格式文件保存到磁盘。 然后,我们可以使用这个格式的文件,所以它不再需要回答这些问题,文件本身没有额外的数据,可以打开没有问题