我在SQL Server 2012中的BCP功能方面有一个小问题。
事情是:
即时通讯使用以下命令加载.jpg图片(大小为167KB):
插入[tabela_testowa](数据)
SELECT * FROM OPENROWSET(BULK N'C:\foty\ch6_MagicShop.jpg',SINGLE_BLOB)a;
然后我尝试使用以下命令将其导出回磁盘:
BCP“从tabela_testowa WHERE ID = 1中选择数据”查询出“C:\test\file.jpg” -T -n -d测试
文件被保存在磁盘上没问题,大小也为167 KB,但是无法像原始副本一样打开。
我不知道BCP导出中的某些参数有问题吗?又或者它在导入阶段被损坏了?
任何人都有类似的问题吗?
最佳答案
谢谢上帝,感谢@ 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:\驱动器上执行此操作。看起来是这样的:
10.0
1
1 SQLBINARY 8 0 "" 1 MyColumn ""
那右边的8位是bcp变量,它指示要添加到文件中的字节数。是 SCSS 破坏了您的文件。将该吸盘更改为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
关于sql-server - SQL Server BCP导出损坏的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27301763/