2014-12-04 74 views
1

我有一个小问题,在SQL Server BCP功能2012 的事情是:SQL Server BCP导出损坏的文件?

INSERT [tabela_testowa](数据) SELECT * FROM:使用以下命令 IM装载的.jpg图像(大小167KB) OPENROWSET(BULK N'C:\ foty \ ch6_MagicShop.jpg',SINGLE_BLOB)a;

,然后即时试图用将其输出回磁盘:

BCP “SELECT FROM tabela_testowa数据WHERE ID = 1” queryout “C:\测试\ file.jpg” -T -n -d测试

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

回答

1

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

1

BCP正在向他的文件添加信息。只有很少的数据,但你不是只输出一个jpg文件。

你说167 KB,但看真正的字节,而不是圆形的尺寸。会有区别。

无法通过BCP导出图像。

+0

OK所以这里的东西。如果我运行命令行没有格式指定(所以没有-n)即时通讯4cp问题: 文件存储类型, 前缀长度, 字段数据的长度,并在最后如果我想保存该信息在文件。如果我选择前缀长度0和字段0的长度,并且最终我回答不是它被保存得很好,并且可以正常打开。然而,我怎么能做到这一点没有提示这些答案?/ – user3494351 2014-12-08 09:45:04

+1

@ user_0这是不正确的,你可以导出图像,你只需要设置格式文件。请参阅下面的答案。 – Conor 2015-08-06 19:43:13

7

感谢上帝,感谢@ user_0 answer和@ 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:\驱动器。下面是它的样子:

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

8右边是变量,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 
+0

如果您遇到有关'.fmt'文件的I/O问题,请确保您在文件末尾添加了n个换行符!上面的例子没有它们。除此之外,解决方案的作品! – avn 2016-04-07 09:54:59

+0

如何**将该吸盘更改为0 ** – 2016-05-14 07:10:41

+0

@avn您是如何在文件末尾添加n的?究竟在哪里? – 2016-10-23 10:34:13