create table 111111(123 image) --
insert into 111111(123) values(0x0011223344556677) -- 建立表,并把16进制文件写入111111表字段123中。
exec master..xp_cmdshell 'bcp "Select 123 from 111111" queryout d:\11.exe -n'
把文件导出出来。导是倒出来了,为什么文件头都加入了4个字节呢?
如正常文件的16进制为0011223344556677
而导出后文件的16进制却变成 00 26 00 00 00 11 22 33
drop database a
go
create database a
go
create table a..t(c1 image) --
insert into a..t(c1) values(0x0011223344556677) --
go
select * from a..t
go
exec master..xp_cmdshell 'bcp "select c1 from a..t" queryout "d:\t.txt" -c -Usa -Psa'
go(1 行受影响)
c1
------------------------------------------------------------
0x0011223344556677(1 行受影响)output
------------------------------------------------------------
NULL
开始复制...
NULL
已复制 1 行。
网络数据包大小(字节): 4096
总时钟时间(毫秒) : 1 平均值: (每秒 1000.00 行。)
NULL(7 行受影响)D:\>type t.txt
0011223344556677D:\>
大神,不是哦,我要导出的是EXE程序。
按16进制导出。可以正常导出EXE程序。但是头部都自动添加了4个字节。导致程序损坏
如正常的EXE文件为
MZ xxxxxxx而导出后变为
& MZ xxxxxxx
MZ前面的这些字符。16进制为00 26 00 00
insert into test(sj) values(0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F) --为节省只写入一点
select * from test
0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F
查询出来的也都正常exec master..xp_cmdshell 'bcp "Select sj from test" queryout d:\11.exe -n'
密码:
NULL
开始复制...
NULL
已复制了 1 行。
数据包的大小(字节): 4096
时钟时间(毫秒): 共 1
NULL
导出来的11.EXE 也正常。是为PE格式
但是无法允许,查询后发现PE头增加了4个节麻烦大神看看。用你的语句exec master..xp_cmdshell 'bcp "select c1 from a..t" queryout "d:\t.txt" -c -Usa -Psa' 是直接把16进制导出来不会自动换为PE格式
这个很清楚啊,加上去的前缀是数据块的长度啊。bcp操作的是一个数据集,多个字段或多条记录总要有方法分割的。
你要是一早描述的数据和前缀一致,就不用反复这么多回了。