SQL Server BCP导出损坏的文件?

时间:2014-12-04 18:55:17

标签: sql-server file export bcp corrupt

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

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

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

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

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

3 个答案:

答案 0 :(得分:9)

感谢上帝,感谢@ user_0回答和@ user3494351的神秘答案和评论this ancient forum post我终于在几个小时的撞击墙头后想出来了。

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

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

首先在命令行中执行此操作:

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

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

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

那个正确的变量是bcp表示要添加到文件中的字节数。这是一个破坏你的文件的混蛋。将该吸盘更改为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

答案 1 :(得分:1)

BCP正在向他的文件添加信息。只有少数数据,但您不是只导出jpg文件。

你说167 KB,但是看实际字节,而不是圆角尺寸。会有所不同。

您无法通过BCP导出图像。

答案 2 :(得分:1)

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