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 

解决方案 »

  1.   


    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:\>
      

  2.   


    大神,不是哦,我要导出的是EXE程序。
    按16进制导出。可以正常导出EXE程序。但是头部都自动添加了4个字节。导致程序损坏
    如正常的EXE文件为
    MZ        xxxxxxx而导出后变为
     &  MZ        xxxxxxx
    MZ前面的这些字符。16进制为00 26 00 00 
      

  3.   

    你直接查询一下 这个 select 语句,看看最前面是不是就有 0026 这些。另外,你这些数据,是怎么写进去的?
      

  4.   

    大神,我是这么弄的。create table test (sj image) --
    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格式
      

  5.   


    这个很清楚啊,加上去的前缀是数据块的长度啊。bcp操作的是一个数据集,多个字段或多条记录总要有方法分割的。
    你要是一早描述的数据和前缀一致,就不用反复这么多回了。